Рекурсивно копіюйте файли з одного каталогу в інший


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/recursivley в каталог /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', до будь-якого скопійованого повторного імені файлу.


1

Припустимо , що у вас є купа .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/et cetera).

У такому випадку в терміналі оболонки (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).


У випадку, коли ви хочете зберегти структуру каталогу, запустіть цю команду з вихідного каталогу. Якщо ви запустите find /source/dir -iname '*.mp3' | cpio -pdm /home/me/music/, він створить / home / me / music / source / dir, і файли будуть скопійовані в це нове місце.
Гаутам,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.