xargs -a filename --null rm с дополнительным разделителем EOF EOF? - PullRequest
1 голос
/ 07 мая 2020

Итак, я удаляю некоторые файлы, используя find с регулярными выражениями, а затем перехожу к xargs -0 rm или просто добавляю --delete

Иногда мне нужно исключить некоторые из них из удаления - я пишу найти вывод в файл, удалить несколько строк и заменить символы новой строки нулевыми символами. Я делаю это в vim, и теперь у меня есть этот символ EOF, который вызывает у меня раздражение, когда я скармливаю его команде удаления. Вот очень упрощенный тестовый пример с использованием файла вместо rm:

[testdir]$ touch t{1..3}
[testdir]$ find . -name 't*' -print0 > xa
[testdir]$ find . -name 't*' > xb
[testdir]$ cat -v xa
./t3^@./t2^@./t1^@[testdir]$ cat xb
./t3
./t2
./t1
[testdir]$ vim xb

В vim я делаю ':% s / \ n / CTRL - @ /' и сохраняю. Впоследствии нежелательный эффект по сравнению с исходным выходным файлом find:

[testdir]$ cat -v xb
./t3^@./t2^@./t1^@
[testdir]$ xargs -a xa -0 file
./t3: empty
./t2: empty
./t1: empty
[testdir]$ xargs -a xb -0 -E '\012' file
xargs: warning: the -E option has no effect if -0 or -d is used.

./t3: empty
./t2: empty
./t1: empty

:    cannot open `\012' (No such file or directory)

rm отлично работает со всеми файлами, просто в конце я получаю сообщение об ошибке. Обратите внимание, как исходный вывод не вставляет новую строку в конце, см. Результат от 'cat xa'. Кроме того, xargs сообщает мне, что я не могу исключить этот символ EOF из-за нулевого разделителя.

Я хотел бы знать, как это исправить, есть идеи?

1 Ответ

0 голосов
/ 07 мая 2020

Новый день - новая перспектива! Я проспал это, и благодаря комментариям KamilCuk теперь все ясно. Во-первых, как он заявил, не существует такого понятия, как символ конца файла. Это просто завершающая новая строка '\ n'.

Как он предложил способ go удаления этой завершающей новой строки:

[testdir]$ cat xb | tr -d '\n'
./t3./t2./t1[testdir]$ 

В качестве альтернативы, для этого c, это тоже работает:

[testdir]$ cat xb | tr -d '\012'
./t3./t2./t1[testdir]$ 

Затем я подумал о случае, когда я хочу, чтобы была удалена только одна завершающая новая строка файла, не беспокоясь о том, что произойдет со всеми остальными символы новой строки, если таковые присутствовали. Это мое предложение для случая:

[testdir]$ head -c -1 xb
./t3./t2./t1[testdir]$ 

Теперь мой файл можно безопасно разделить с помощью xargs -0 и Voilà!

...