Почему мой конвейер не работает?

Почему мой конвейер не работает?

Я пытаюсь сделать скрипт 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.

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