1

Рассматривать:

cat fileNames.txt | xargs find . -name

Я ожидаю, что приведенная выше команда найдет путь к каждому имени файла в fileNames.txt, но эта команда не выдает никаких результатов. Зачем?

4 ответа4

4

Решение будет:

 xargs --max-args=1 find . -iname < fileNames.txt
3

Обычный вызов xargs удаляет символы новой строки, помещая все строки из ввода в одну командную строку. Однако вы можете использовать опцию -I <pattern> , где для каждой строки ввода будет вызываться команда с заменой <pattern> содержимым строки.

Также обратите внимание, что вам, вероятно, следует добавить опцию -print чтобы в списке были указаны пути.

cat fileNames.txt | xargs -I {} find . -name {} -print
1

Опция -name принимает только один аргумент. Я не уверен, почему вы не получаете сообщение об ошибке. Пытаться

sed 's/.*/-name "&"/' fileNames.txt | xargs find .
1

Ответы до сих пор трудно найти с именами файлов, содержащими пробел, 'или ":

$ 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.

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