Проблема с тем, как вы используете xargs
, заключается в том, что по умолчанию xargs
будет добавлять аргументы в конец предоставленной вами командной строки.Таким образом, в конечном итоге вы запустите кучу mv
команд, которые выглядят так:
mv /Users/myname/Volumes/LaCie/model/folder/media foo.mp3
Это можно исправить, указав xargs
, где размещать аргументы в команде:
<other commands> | xargs -I{} mv {} /Users/myname/Volumes/LaCie/model/folder/media
Опция -I
позволяет вам указать любую произвольную строку в качестве заполнителя для того, куда должны идти аргументы.Я использовал {}
только потому, что кажется, что это обычный токен, который, как вы видите, используется в аналогичных контекстах (например, с опцией -exec
find
, как показано ниже).
Но есть более простой способспособ сделать это, используя параметр -exec
команды find
:
find . -name '*.mp3' -exec mv {} /Users/myname/Volumes/LaCie/model/folder/media \;
Также обратите внимание на часть -name '*.mp3'
, которая позволяет избавиться от части | grep ".mp3"
.
Наконец, просто чтобы быть в безопасности, я бы лично поставил /
в конце вашего пути назначения.Если каталог media
не существует в /Users/myname/Volumes/LaCie/model/folder
, или если в этом месте существует элемент, не являющийся каталогом (например, обычный файл или символическая ссылка) с именем media
, то приведенная выше команда find
будет счастливопросто переместите все свои mp3-файлы, по одному, в эту папку, создавая файл с именем media
каждый раз.И вы потеряете всех ваших mp3-файлов, кроме последнего, который теперь будет файлом с именем media
.
Однако с завершающим /
, если media
не является каталогом, команды mv
завершатся ошибкой, сообщив об этом.Таким образом, измененная команда будет выглядеть следующим образом:
find . -name '*.mp3' -exec mv {} /Users/myname/Volumes/LaCie/model/folder/media/ \;
Обновление : согласно приведенному ниже комментарию Гордона Дэвиссона, вы также должны рассмотреть возможность добавления -i
или -n
к команде mv
, чтобыИзбегайте случайной перезаписи файлов с повторяющимися именами.Например, если у вас есть a/foo.mp3
и b/foo.mp3
, вышеприведенная команда перезапишет одну с другой.Параметр -i
заставит mv
запрашивать подтверждение каждого перемещения файла, тогда как параметр -n
(он же --no-clobber
) не позволит mv
перезаписать файл, если файл с таким именем уже существует.