Рассматривать:
cat fileNames.txt | xargs find . -name
Я ожидаю, что приведенная выше команда найдет путь к каждому имени файла в fileNames.txt, но эта команда не выдает никаких результатов. Зачем?
Решение будет:
xargs --max-args=1 find . -iname < fileNames.txt
Обычный вызов xargs
удаляет символы новой строки, помещая все строки из ввода в одну командную строку. Однако вы можете использовать опцию -I <pattern>
, где для каждой строки ввода будет вызываться команда с заменой <pattern>
содержимым строки.
Также обратите внимание, что вам, вероятно, следует добавить опцию -print
чтобы в списке были указаны пути.
cat fileNames.txt | xargs -I {} find . -name {} -print
Опция -name
принимает только один аргумент. Я не уверен, почему вы не получаете сообщение об ошибке. Пытаться
sed 's/.*/-name "&"/' fileNames.txt | xargs find .
Ответы до сих пор трудно найти с именами файлов, содержащими пробел, 'или ":
$ echo \'\ \" | xargs -I {} find . -name {} -print
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
$ echo \'\ \" | sed 's/.*/-name "&"/' | xargs find .
xargs: unmatched double quote; by default quotes are special to xargs unless you use the -0 option
find: missing argument to `-name'
Если файлы сделаны пользователями, вы увидите смешные именованные файлы. Если у вас установлен GNU Parallel, вы можете сделать:
cat fileNames.txt | parallel find . -name {} -print
Посмотрите вступительное видео, чтобы узнать больше о GNU Parallel: http://www.youtube.com/watch?v=OpaiGYxkSuQ
GNU Parallel можно загрузить по адресу ftp://ftp.gnu.org/gnu/parallel/, и, как сообщается, он работает под управлением Cygwin.