
Я пытаюсь переместить несколько файлов .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 grep
didn't find avi
. Поскольку grep
обычно ищет в файле, такой переключатель выведет список имен файлов, не содержащих шаблон avi
внутри них. В вашем случае, однако, поскольку вы передаете в grep
from 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
.