Я хочу передать имена файлов другим программам, но все они задыхаются, когда имена содержат пробелы.
Допустим, у меня есть файл с именем.
foo bar
Как я могу find
вернуть правильное имя?
Очевидно, я хочу:
foo\ bar
или:
"foo bar"
РЕДАКТИРОВАТЬ : Я не хочу проходить xargs
, я хочу получить правильно отформатированную строку, find
чтобы я мог передать строку имен файлов непосредственно в другую программу.
find
форматирует имена файлов просто отлично; они написаны по одному имени в строке. (Конечно, это неоднозначно, если имя файла содержит символ новой строки.) Таким образом, проблема заключается в том, что принимающая сторона «задыхается», когда получает пробел, а это означает, что вы должны сказать нам, что является получающей стороной, если вы хотите значимого ответа ,
find
предложить вариант вывода имен файлов в формате, подходящем для оболочки. В целом, однако, расширение -print0
GNU find
прекрасно работает для многих других сценариев (тоже), и вы должны научиться использовать его в любом случае.
ls $(command...)
не прокручивает список stdin
. Он помещает вывод $(command...)
непосредственно в командную строку. В этом случае это оболочка, которая читает из c, и она будет использовать текущее значение, $IFS
чтобы решить, как разбить вывод на слово. В общем, вам лучше использовать xargs
. Вы не заметите удар по производительности.
find -printf '"%p"\n'
добавит двойные кавычки вокруг каждого найденного имени, но не будет правильно заключать в кавычки двойные кавычки в имени файла. Если в именах ваших файлов нет встроенных двойных кавычек, вы можете проигнорировать проблему: или передать через sed 's/"/&&/g;s/^""/"/;s/""$/"/'
. Если ваши имена файлов в конечном итоге обрабатываются оболочкой, вы, вероятно, должны использовать одинарные кавычки вместо двойных кавычек (в противном случае sweet$HOME
это станет чем-то вроде sheet/home/you
). И это все еще не очень устойчиво к именам файлов с символами новой строки в них. Как вы хотите справиться с этим?
-exec
флаге сfind
? Вы могли бы потенциально устранить эту ошибку и сделать свою команду более эффективной, выполнив-exec
вместо передачи ее другим командам. Просто мои $ .02