xargs с rm + filename, содержащим пробелы

Если вы используете последние версии RHEL (Red Hat Enterprise Linux) или Fedora, смотрите принятый ответ на этот вопрос. Это решение может работать и в других дистрибутивах, если ваш демон SSH достаточно новый.

0
05.04.2018, 17:11
1 ответ
xargs -d "\n" -I {} rm \"{}\"

Предполагается, что версия xargsGNU coreutils поддерживает параметр -dдля указания разделителя.

Это не будет работать вместе с вашей командой find, поскольку она добавляет двойные кавычки к путям, найденным с помощью find. Это означает, что вместо ./somedir/file.scalaвызов rmвыполняется с литеральным путем "./somedir/file.scala".

Пример:

$ touch hello
$ touch '"hello"'
$ ls
"hello" hello
$ echo hello | xargs -d "\n" -I {} rm \"{}\"
$ ls
hello

Это работает, когда вы передаете сгенерированные команды в bash, потому что bashудаляет кавычки.

Это, вероятно, также сработало бы, если бы вы не прилагали дополнительных усилий, чтобы добавить кавычки в первую очередь:

xargs -d "\n" -I {} rm {}

Чтобы правильно удалить файлы, используйте

find. -type f -name '*.scala' -delete

или, если вы все еще хотите использоватьxargs:

find. -type f -name '*.scala' -print0 | xargs -0 rm

, который передает пути между findи xargsв виде списка с нулевыми разделителями -. Nul(\0)— это единственный символ , который не разрешен в имени пути в системах Unix. Имена файлов также не могут содержать /, но допускаются символы новой строки.

Третьим вариантом может быть вызов rmнепосредственно из find:

.
find. -type f -name '*.scala' -exec rm {} +

Обратите внимание, что {}не обязательно должно быть (и не должно быть )в кавычках, так как findпрекрасно знает, как передавать пути с пробелами (, переводами строк или чем-то еще )к названной утилите.

6
28.01.2020, 02:16

Теги

Похожие вопросы