ошибка использования при перемещении файлов одного расширения в каталог - PullRequest
0 голосов
/ 01 марта 2019

У меня есть файлы с расширением .mp3, которые находятся в разных папках в каталоге, и мне нужно переместить их все в один каталог для работы.Я просмотрел несколько уроков и вопросов по SO, и что бы я ни пытался, я либо получаю

    usage: mv [-f | -i | -n] [-v] source target
    mv [-f | -i | -n] [-v] source ... directory

, либо "Нет такого файла или каталога".

Слишком многов каждую отдельную папку, но сейчас я перехожу в одну из папок.С этим:

    mv *.mp3 /Users/myname/Volumes/LaCie/model/folder/media

Я получаю ошибку «использования» выше.Я посмотрел на Перемещение файлов в каталог и попытался:

    find . | grep ".mp3" | xargs mv /Users/myname/Volumes/LaCie/model/folder/media

и получил ту же ошибку.

Что я делаю не так?Какой правильный синтаксис?Кроме того, смогу ли я извлечь файлы mp3 и переместить их, если я нахожусь в каталоге, содержащем каталог с файлами, но не в этом каталоге?Я ценю понимание этого.Спасибо.

РЕДАКТИРОВАТЬ: Основная часть этой проблемы заключалась в том, что путь при использовании / Volumes начинается с / Volumes.Я делал / Users / myname / Volumes, и это было одной из причин, по которой у меня было так много проблем.

Ответы [ 2 ]

0 голосов
/ 01 марта 2019

Проблема с тем, как вы используете 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 перезаписать файл, если файл с таким именем уже существует.

0 голосов
/ 01 марта 2019

Существуют различные реализации и версии mv.Вы можете проверить допустимый синтаксис вашей версии, используя man mv.

  • Если у вас GNU mv, вы можете использовать mv -t target/dir *.mp3.
  • Большинство реализаций должны поддерживать mv *.mp3 target/dir.
  • Если ваш mv поддерживает только абсолютный минимум mv source target с ровно одним исходным и одним целевым файлом, вы можете использовать следующую команду, которая всегда должна работать, если существует target/dir/.

for i in *.mp3; do mv "$i" "target/dir/$i"; done
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...