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

У этого вопроса уже есть ответ: Перемещение файлов определенного типа / расширения из одного каталога в другой? 2 ответа
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/

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

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

0
задан 10 November 2017 в 21:11

6 ответов

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

echo ~ | xargs ls -A

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

find -print 0 | xargs -0

. Это приводит к тому, что find добавляет нулевой символ к каждому filename и 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
ответ дан 22 May 2018 в 16:20

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

echo ~ | xargs ls -A

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

find -print 0 | xargs -0

. Это приводит к тому, что find добавляет нулевой символ к каждому filename и 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
ответ дан 18 July 2018 в 03:31

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

echo ~ | xargs ls -A

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

find -print 0 | xargs -0

. Это приводит к тому, что find добавляет нулевой символ к каждому filename и 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
ответ дан 24 July 2018 в 17:51

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

Вы опустили символ трубы (|), чтобы подключить выход find к входу xargs.

Еще одна точка - Использование опции [-0 "для xargs требует от вас найти find для разделения имен файлов с помощью NUL s, с -print0 - вы этого не делаете.

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

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

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

Вы опустили символ трубы (|), чтобы подключить выход find к входу xargs.

Еще одна точка - Использование опции [-0 "для xargs требует от вас найти find для разделения имен файлов с помощью NUL s, с -print0 - вы этого не делаете.

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

3
ответ дан 18 July 2018 в 03:31

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

Вы опустили символ трубы (|), чтобы подключить выход find к входу xargs.

Еще одна точка - Использование опции [-0 "для xargs требует от вас найти find для разделения имен файлов с помощью NUL s, с -print0 - вы этого не делаете.

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

3
ответ дан 24 July 2018 в 17:51
  • 1
    Я сделал. :) Я попытался его реализовать, но по какой-то причине это не сработало: \ (возможно, я схожу); команда mv не работает: mv target 'home / tony / Desktop / unsorted_files / 10439__batchku__gbell-8-1-pp.aif & quot; не является каталогом – IronUhlan 10 November 2017 в 20:51

Другие вопросы по тегам:

Похожие вопросы: