mv жалуется на стандартный ввод в конвейере, который фильтрует имя файла с помощью grep

mv жалуется на стандартный ввод в конвейере, который фильтрует имя файла с помощью grep

Я пытаюсь переместить несколько файлов .avi, в которых есть пробелы, с CD в свою домашнюю папку. Я уже знаю, как избавиться от пробелов:

find /media/mathscd/ | grep -L -r "*.avi" | for file in *; do mv "$file" echo $file | tr ' ' '_' ; done

Но я борюсь, чтобы Move нашёл отредактированные файлы и переместил их в папку. Я продолжаю получать ошибку mv: cannot stat '(standard input)': No such file or directory. Вот код, который я пытаюсь использовать:

find /media/mathscd/ | grep -L -r  "*.avi" | xargs -I{} mv {} /home/09murphyt/Downloads/

Может ли кто-нибудь мне подсказать, что я делаю не так?

решение1

Ваша проблема заключается в -Lпереключении на grep. Из страницы руководства:

L, --files-without-match
Подавить нормальный вывод; вместо этого вывести имя каждого входного файла, из которого обычно не выводился бы вывод. Сканирование остановится при первом совпадении.

Поэтому вместо того, чтобы перечислятьимена файловкоторые не соответствуют, aviон только перечисляетместоwhere grepdidn't find avi. Поскольку grepобычно ищет в файле, такой переключатель выведет список имен файлов, не содержащих шаблон aviвнутри них. В вашем случае, однако, поскольку вы передаете в grepfrom find, файл, который grepсчитывается, — (standard input). Чтобы понять, что я имею в виду, попробуйте:

find /media/mathscd | grep -L "*.avi"

результат:

(standard input)

Другими словами, grepобнаружил строки, не соответствующие "*.avi"стандартному вводу, что и произошло.

Так как findимена файлов перечислены напрямую, вам нужно только инвертировать смысл соответствия:

find /media/mathscd | grep -v ".*\.avi"

(обратите внимание, что grepшаблоны отличаются от подстановочных знаков оболочки; вам также не нужен переключатель -r)

Также, используя findотдельно:

find /media/mathscd ! -name "*.avi"

решение2

Попробуйте один из этих вариантов:

find /media/mathscd/ -name *.avi -exec mv -t ~/Downloads/ {} +
find /media/mathscd/ -name *.avi -print0 | xargs -0 mv -t ~/Downloads/

Обязательно проверьте его, заменив xargs mv*сначала xargs ls.

Связанный контент