
Я пытаюсь сделать скрипт bash, который найдет все mp3 в моей папке Downloads и переместит их в папку music. Почему эта строка не работает?
find ./ -type f -name \*.mp3 | mv *.mp3 /home/mitch/Desktop/Music/$ARTIST
Я попытался использовать конвейер, чтобы перевести информацию из первой команды во вторую, но я никогда раньше не пользовался конвейерами и не знаю, делаю ли я это неправильно или у меня неправильное представление о том, для чего они используются.
решение1
Команда mv
не использует свой stdin, поэтому вам придется преобразовать stdin в параметр, для этого можно использовать xargs
:
find ./ -type f -name '*.mp3' | xargs mv -t /home/mitch/Desktop/Music/$ARTIST
Также вы можете напрямую использовать -exec
действие find
:
find ./ -type f -name '*.mp3' -exec mv {} /home/mitch/Desktop/Music/$ARTIST ';'
Редактировать
Как указал @geirha, первая команда не работает, если у вас есть имена файлов, содержащие пробелы. В таком случае это должно быть следующим образом
find ./ -type f -name '*.mp3' -print0 | xargs -0 mv -t /home/mitch/Desktop/Music/$ARTIST
решение2
Преимущество xargs в том, что расширение командной строки. Если у вас есть команда, которая возвращает очень большой объем текста (или много файлов в одной команде), вам понадобится xargs.
Если у вас в каталоге несколько тысяч файлов и вы хотите запустить какой-то скрипт в этом списке, вы можете попробовать " ./myprogram *
", но если ваша программа имеет какие-либо ограничения на размер параметра, вы можете переполнить буфер, расширив *. Кроме того, сама командная строка имеет ограничения, поэтому команда может завершиться неудачей из-за переполнения буфера командной строки. Использование xargs позволит избежать этой проблемы.
наконец, опция -print0 в find поместит нулевые разделители для пробелов в возвращаемых именах файлов, а опция -0 в xargs будет интерпретировать эти нулевые значения. Читать man xargs
.