Rekurencyjnie kopiuj pliki z jednego katalogu do drugiego

11

Mam całą moją muzykę w folderze /media/kalenpw/MyBook/Music/ABunchOfOtherFoldersWithFilesInside. Chcę skopiować wszystkie pliki MP3, /media/kalenpw/HDD/Musicwięc użyłem:

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

jednak to tylko skopiowało pliki mp3 z głównego katalogu muzycznego i nie otworzyło żadnego z podkatalogów wykonawcy i nie skopiowało tych plików.

Miałem wrażenie, -Rże rekursywnie skopiuję wszystkie pliki. Jak mogę osiągnąć wspomniany cel?

kalenpw
źródło

Odpowiedzi:

19

Posługiwać się:

find /media/kalenpw/MyBook/Music/ -name '*.mp3' -exec cp {} /media/kalenpw/HDD/Music \;

Powodem polecenia nie działa to, że nazwy zawierające symbole wieloznaczne ( *.mp3) są rozszerzane przed komenda jest wykonywana, więc jeśli miał trzy pliki ( 01.mp3, 02.mp3, 03.mp3) swój skuteczne polecenie było:

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

Jak widać -R, w tym przypadku nie ma żadnego efektu.

techraf
źródło
Polecam -inamezamiast -namena wypadek, gdyby jakieś pliki się kończyły .MP3.
Olathe
Dziękuję, że zadziałało. A przynajmniej jest w trakcie pracy.
kalenpw
5

W szczególności wspomniałeś o plikach / katalogach, które chcesz skopiować, używając *.mp3np. Dowolnej nazwy pliku / katalogu kończącej się na .mp3.

Więc każdy plik kończy się .mp3w /media/kalenpw/MyBook/Music/katalogu i podobnie, każdy katalog kończące się .mp3w /media/kalenpw/MyBook/Music/zostaną skopiowane, rekurencyjnie. Jeśli nie ma takiego dopasowanego pliku / katalogu, nic nie zostanie skopiowane.

Teraz, aby skopiować wszystkie .mp3pliki z /media/kalenpw/MyBook/Music/recursivley do katalogu /media/kalenpw/HDD/Music/:

  • Używanie bash:

    shopt -s globstar
    cp -at /media/kalenpw/HDD/Music /media/kalenpw/MyBook/Music/**/*.mp3
    
  • Używanie find:

    find /media/kalenpw/MyBook/Music -type f -name '*.mp3' -exec cp -at /media/kalenpw/HDD/Music {} +
    
heemayl
źródło
Dzięki, techraf odpowiedział pierwszy, więc zaakceptowałem ich odpowiedź.
kalenpw
1

Możesz także użyć cpr :

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

Zauważ, że bez -p cpr zachowa pełne ścieżki katalogów na skopiowanych nazwach plików.
-rmożna użyć (zamiast -p) do zachowania ścieżki w „/media.../Music/”.
Zadba również o cprto, aby żaden plik nie został nadpisany, dodając liczbę zaczynającą się od „0001” do kopiowanej powtarzanej nazwy pliku.

circulosmeos
źródło
1

Załóżmy, że masz kilka .docx, .mp3, .txti .xlsxplików przechowywanych w tej strukturze katalogów:

/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/

... i chcesz powrócić do wszystkich takich katalogów w celu skopiowania wszystkich znalezionych .mp3plików, /home/me/music/ale nie chcesz zachować takiego drzewa katalogów w miejscu docelowym (tzn. chcesz, aby wszystkie znalezione .mp3pliki zostały skopiowane /home/me/music/zamiast skopiowane do odpowiednich katalogów taki jak /home/me/music/dir1/, /home/me/music/dir1/dir11/i tak dalej).

W takim przypadku najpierw uruchom terminal w powłoce (bash), aby uzyskać dostęp do katalogu głównego wyszukiwania plików:

cd /files

... a następnie uruchom to polecenie:

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

W przypadku, gdy nie chcesz, aby zachować drzewa katalogów ze źródła w miejscu przeznaczenia, zamiast tego polecenia (po uruchomieniu cd /files):

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

Na powyższych poleceń, wyszukiwanie jest wielkość liter (tj mecze .mp3, .MP3, .mP3i .Mp3). Użyj -namezamiast -inamejeśli chcesz wyszukiwania być rozróżniana (np używając -namedo .mp3łańcucha znaków dopasuje pliki kończące się .mp3ale nie tych, kończąc .MP3, .mP3ani .Mp3).

Yuri Sucupira
źródło
W przypadku, gdy chcesz zachować strukturę katalogów, uruchom to polecenie z katalogu źródłowego. Jeśli uruchomisz find /source/dir -iname '*.mp3' | cpio -pdm /home/me/music/, utworzy / home / me / music / source / dir, a pliki zostaną skopiowane do tej nowej lokalizacji.
Gautam