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 по отношению к параметрам.
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 -- {} +
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 -- {} +
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 -- {} +
«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 - вы этого не делаете.
Вы прочитали мой ответ Перемещение файлов определенного типа / расширения из одного каталога в другой? ?
«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 - вы этого не делаете.
Вы прочитали мой ответ Перемещение файлов определенного типа / расширения из одного каталога в другой? ?
«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 - вы этого не делаете.
Вы прочитали мой ответ Перемещение файлов определенного типа / расширения из одного каталога в другой? ?