6

У меня есть эта команда:

find $1 | xargs touch

Но файлы с ' в именах завершаться„xargs: непревзойденная одинарные кавычки“, и я думаю , другие специальные символы будут вызывать те же проблемы.

Как я могу избежать вывода, чтобы эта команда работала со всеми именами файлов?

3 ответа3

8

Вот более простой, быстрый и самый портативный способ сделать это:

find $1 -exec touch {} +

Обратите внимание на синтаксис + окончание. В отличие от более популярных \; синтаксис окончания exec , + упаковывает аргументы так же, как и xargs .

По сравнению с часто предлагаемой find ... | xargs ... , это решение find только более эффективно, потому что:

  • один процесс обрабатывает всю задачу
  • нет передачи данных
  • дополнительная обработка, связанная с хаком "\0", не требуется.

Будучи POSIX совместимых, он также работает с большинством , если не все современные реализации find в отличие от find -print0 и xargs -0 , которые оба GNUisms.

7
find $1 -print0 | xargs -0 touch

Это завершает каждое имя файла с \000 (символ 0) и дает команду xargs ожидать, что имена файлов заканчиваются на \000

   -print0
          True; print the full file name on the standard output,  followed
          by  a  null  character  (instead  of  the newline character that
          -print uses).  This allows file names that contain  newlines  or
          other  types  of white space to be correctly interpreted by pro‐
          grams that process the find output.  This option corresponds  to
          the -0 option of xargs.
0

Если вы вводите не из find , а из какой-либо другой программы, генерирующей строки, вы можете взглянуть на GNU Parallel, который прекрасно работает с именами файлов, содержащими '"и пробел:

find | parallel touch

Посмотрите вступительное видео, чтобы узнать больше: Часть 1. GNU Параллельная обработка и выполнение скриптов

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .