Я хочу передать имена файлов другим программам, но все они задыхаются, когда имена содержат пробелы.
Допустим, у меня есть файл с именем.
foo bar
Как я могу findвернуть правильное имя?
Очевидно, я хочу:
foo\ bar
или:
"foo bar"
РЕДАКТИРОВАТЬ : Я не хочу проходить xargs, я хочу получить правильно отформатированную строку, findчтобы я мог передать строку имен файлов непосредственно в другую программу.
findформатирует имена файлов просто отлично; они написаны по одному имени в строке. (Конечно, это неоднозначно, если имя файла содержит символ новой строки.) Таким образом, проблема заключается в том, что принимающая сторона «задыхается», когда получает пробел, а это означает, что вы должны сказать нам, что является получающей стороной, если вы хотите значимого ответа ,
findпредложить вариант вывода имен файлов в формате, подходящем для оболочки. В целом, однако, расширение -print0GNU 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