Вопрос: find: пути должны предшествовать выражению:) xargs [duplicate]


На этот вопрос уже есть ответ:

mkdir dregsfolder
find /home/tony/Desktop/unsorted_files/ -maxdepth 1 -not \( -type d -or -iname "*.jpg" -or -iname "*.gif" -or -iname "*.docx" \)xargs -0 --no-run-if-empty mv /home/tony/Desktop/dregsfolder

Когда я запускаю этот код; Я советую

find: paths must precede expression: )xargs

Я смущен, поскольку я думал, что путь уже был указан с помощью /home/tony/Desktop/unsorted_files,

Я еще больше смущен, потому что в этот вопрос на Unix и Linux Stack Exchange у нас есть пример xargs копирование файлов в каталог, называемый play:

find /tmp/ -ctime -1 -name "x*" | xargs -I '{}' mv '{}' ~/play/

И здесь кажется, что целевой каталог, т. Е. Играет; было указано ПОСЛЕ xargs...

Я хочу уточнить точные механизмы, связанные с xargs и связанные с ним нюансы, для синтаксического анализа не ТОЛЬКО файла из каталога (как идентифицировано в предыдущем вопросе), а, более того, его более широкое использование в мире unix по отношению к параметрам.


0
2017-11-10 16:24


Источник


Вы просто забыли половину линии, это должно быть … "*.docx" \) -print0 | xargs -0 …, Не просто опускайте важные команды и варианты! - dessert
man mv заявляет, что вы можете использовать его как mv SOURCE DEST или mv -t DIRECTORY SOURCE, - dessert
Предпочтительно, если вы можете размещать отдельные вопросы, а не комбинировать свои вопросы в одном. Таким образом, это помогает людям отвечать на ваш вопрос, а также другим, охотящимся хотя бы на один из ваших вопросов. Благодаря! - dessert
Это в основном askubuntu.com/q/974735/507051 снова, не так ли? Вы также не должны публиковать то, что в основном одно и то же снова и снова, и два вопроса в одном. - dessert


Ответы:


xargs пытается построить список аргументов из его stdin (стандартный ввод). Часто, stdin of xargs является выходом некоторой команды, которая была xargs, Чтобы создать бесполезный пример, мы можем тратить много символов, перечисляя файлы в нашем домашнем каталоге, а не просто печатать ls -A ~ как это:

echo ~ | xargs ls -A

Оператор трубы | принимает стандартный вывод команды слева от нее и передает ее как stdin команды справа от нее. Важно помнить, что stdout - это просто поток текста, который может вызвать проблемы при передаче второй команде xargs если он содержит пробелы или специальные символы. Когда мы используем find, выход которого - имена файлов, с xargs, чтобы избежать ошибок, вызванных специальными символами, мы обычно используем

find -print 0 | xargs -0

Это вызывает find добавить нулевой символ к каждому имени файла и xargs интерпретировать список как нуль-разграниченный, а не ограничивать пространство. Нулевой символ не может отображаться в именах файлов, поэтому нет никаких шансов, что имя файла будет интерпретироваться как два имени файла, если мы разделим его на нулевой символ.

Поскольку вы пропустили символ трубы | который разделяет и соединяет две команды find а также xargs, find думал, что )xargs был одним из его аргументов, и поскольку он не начинался с - или выполните действительный тест, начинающийся с -, он решил, что )xargs должен быть путь, который вы хотите найти, но paths must precede expression, синтаксис find требуется указать путь к поиску перед другими аргументами.

Многие люди предпочитают использовать -exec с find вместо того, чтобы xargs (видеть В чем разница между find с -exec и xargs?), например:

find / path -tests ... -exec some_command {} +

Это может быть более подходящим в вашем случае, особенно mv команда ожидает, что его последним аргументом будет назначение. Вы можете использовать xargs -I {} mv {} /path/to/destination но это было бы более читаемым и, возможно, более эффективным, чтобы указать место назначения с помощью -t

find /home/tony/Desktop/unsorted_files/ -maxdepth 1 -not \( -type d -or -iname "*.jpg" -or -iname "*.gif" -or -iname "*.docx" \) -exec mv -t /home/tony/Desktop/dregsfolder -- {} +

5
2017-11-10 17:04





"find: paths must precede expression: )xargs" является findчто он обрабатывал его параметры, он видел что-то похожее на исходную точку (на самом деле это не выглядело как выражение). После того, как он подумал, что это было сделано для разбора путей для поиска, и он увидел, что проблема вокруг ")xargs». man find говорит find [-H] [-L] [-P] [-D debugopts] [-Olevel] [starting-point...] [expression]

Вы опустили трубу (|) для подключения findвыход на xargs.

Другой момент - использование "-0"вариант xargs  требует вы можете найти, чтобы отделить имена файлов с NULс, с -print0 - Нет.

Вы прочитали мой ответ Перемещение файлов определенного типа / расширения из одного каталога в другой? ?


3
2017-11-10 16:43



Я сделал. :) Я попытался его реализовать, но по какой-то причине это не сработало: \ (возможно, я схожу); команда mv не работает: mv target 'home / tony / Desktop / unsorted_files / 10439__batchku__gbell-8-1-pp.aif "не является каталогом - IronUhlan