Рекурсивно скопируйте файлы от одного каталога до другого

У меня есть вся своя музыка в папке /media/kalenpw/MyBook/Music/ABunchOfOtherFoldersWithFilesInside. Я хочу скопировать все mp3s к /media/kalenpw/HDD/Music таким образом, я использовал:

cp -R /media/kalenpw/MyBook/Music/*.mp3 /media/kalenpw/HDD/Music

однако это только скопировало mp3s в корневой музыкальной папке и не открыло ни одного из подкаталогов художника и скопировало те файлы.

У меня создалось впечатление -R рекурсивно скопировал бы все файлы. Как я могу достигнуть, сказала цель?

11
задан 24 July 2016 в 01:46

4 ответа

Использование:

find /media/kalenpw/MyBook/Music/ -name '*.mp3' -exec cp {} /media/kalenpw/HDD/Music \;
<час>

причина Вашей команды, не работающей, состоит в том, который называет содержащий подстановочные знаки (*.mp3), расширены, прежде чем команда выполняется, поэтому если у Вас было три файла (01.mp3, 02.mp3, 03.mp3), Ваша эффективная команда была:

cp -R /media/kalenpw/MyBook/Music/01.mp3 /media/kalenpw/MyBook/Music/02.mp3 /media/kalenpw/MyBook/Music/03.mp3 /media/kalenpw/HDD/Music

, Как Вы видите -R, не имеет никакого эффекта в этом случае.

18
ответ дан 23 November 2019 в 03:55

Вы конкретно упомянули файлы (файлы) / каталог (каталоги), который будет скопирован как использование *.mp3 т.е. любой файл/имя каталога, заканчивающийся в .mp3.

Так любой файл, заканчивающийся в .mp3 в /media/kalenpw/MyBook/Music/ каталог и точно так же любой каталог, заканчивающийся в .mp3 в /media/kalenpw/MyBook/Music/ будет скопирован, рекурсивно. Если не будет такого подобранного файла/каталога, то ничто не будет скопировано.

Теперь скопировать все .mp3 файлы от /media/kalenpw/MyBook/Music/ рекурсивно к каталогу /media/kalenpw/HDD/Music/:

  • Используя bash:

    shopt -s globstar
    cp -at /media/kalenpw/HDD/Music /media/kalenpw/MyBook/Music/**/*.mp3
    
  • Используя find:

    find /media/kalenpw/MyBook/Music -type f -name '*.mp3' -exec cp -at /media/kalenpw/HDD/Music {} +
    
5
ответ дан 23 November 2019 в 03:55

Можно также использовать CPR:

$ cd /media/kalenpw/HDD/Music
$ cpr -p '/\.mp3$/' '/media/kalenpw/MyBook/Music/'

Отметьте это без -p CPR сохранит пути полного списка на скопированных именах файлов.
-r может использоваться (вместо -p) сохранить путь под '/media.../музыка / '.
Также cpr будет заботиться, что никакой файл не перезаписывается, добавляя число, запускающееся в '0001' к любому повторному скопированному имени файла.

1
ответ дан 23 November 2019 в 03:55

Предположим, что у Вас есть набор .docx, .mp3, .txt и .xlsx файлы сохранили в этой структуре каталогов:

/files/
/files/dir1/
/files/dir1/dir11/
/files/dir1/dir12/
/files/dir1/dir13/
/files/dir2/
/files/dir3/
/files/dir3/dir31/
/files/dir3/dir32/
/files/dir4/
/files/dir5/
/files/dir51/
/files/dir52/
/files/dir53/
/files/dir54/

... и Вы хотите рекурсивно вызвать во все такие каталоги для копирования всех найденных .mp3 файлы к /home/me/music/ но Вы не хотите сохранять такое дерево каталогов в месте назначения (т.е. Вы хотите все найденные .mp3 файлы, которые будут скопированы в /home/me/music/ вместо скопированного в соответствующие каталоги такой как /home/me/music/dir1/, /home/me/music/dir1/dir11/ и так далее).

В таком случае, на терминале оболочки (удар) первый показ эта команда для доступа к корню поиска файла:

cd /files

... и затем выполненный эта команда:

for i in `find . -iname '*.mp3'`; do cp $i /home/me/music/; done

В случае, если Вы действительно хотите сохранить дерево каталогов источника в месте назначения, выполнить эту команду вместо этого (после того, как выполнение cd /files):

find . -iname '*.mp3' | cpio -pdm /home/me/music/

На вышеупомянутых командах поиск нечувствителен к регистру (т.е. соответствия .mp3, .MP3, .mP3 и .Mp3). Использовать -name вместо -iname если Вы хотите, чтобы поиск был чувствителен к регистру (например, использование -name для .mp3 строка символов будет соответствовать файлам, заканчивающимся .mp3 но не те, которые заканчиваются .MP3, .mP3 ни .Mp3).

0
ответ дан 23 November 2019 в 03:55

Другие вопросы по тегам:

Похожие вопросы: