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


11

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

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

однако это только скопировало mp3-файлы в корневую папку музыки и не открывало ни один из подкаталогов исполнителя и копировало эти файлы.

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

Ответы:


19

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

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, не имеет никакого эффекта в этом случае.


Я рекомендую -inameвместо того, чтобы -nameфайлы заканчивались .MP3.
Олат

Спасибо, это сработало. Или, по крайней мере, находится в процессе работы.
Kalenpw

5

Вы специально упомянули файлы (ы) / каталог (и), которые нужно скопировать, используя, *.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 {} +
    

Спасибо, techraf ответил первым, поэтому я принял их ответ.
Kalenpw

1

Вы также можете использовать cpr :

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

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


0

Предположим , что у вас есть куча .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/и так далее).

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

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).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.