Chcę wykonać kopię zapasową tylko moich folderów muzycznych FLAC. Pliki FLAC można zagnieżdżać w folderach w następujący sposób:
AlbumName/
├── Files/
│ ├── someSong01.flac
│ ├── someSong02.flac
├── Covers/
│ ├── someCover01.jpg
│ └── someCover02.jpg
Jak skopiować i przenieść wszystkie foldery AlbumName wraz z odpowiednią strukturą i zawartością, które zawierają gdzieś wewnątrz co najmniej jednego pliku FLAC (założę się, że wystarczy powiedzieć: muzyka jest w formacie FLAC)
EDYCJA: Pliki FLAC mogą być zagnieżdżone; więc mogę mieć:
AlbumName2/
├── someSong01.flac
├── someSong02.flac
├── Covers/
│ ├── someCover01.jpg
| └── someCover02.jpg
I chcę skopiować te foldery z całą ich zawartością, nie tylko plikami FLAC, i wkleić do innego katalogu.
Więc jeśli ja też
AlbumName3/
├── someSong01.mp3
├── someSong02.mp3
├── Covers/
│ ├── someCover01.jpg
| └── someHiddenSong.flac
i
AlbumName4/
├── Files/
│ ├── someSong01.mp3
│ ├── someSong02.mp3
├── Covers/
│ ├── someCover01.jpg
│ └── someCover02.jpg
Chcę rekurencyjnie cp do innego katalogu AlbumName, AlbumName2 i AlbumName3, ale nie AlbumName4
EDYCJA: Żadna z odpowiedzi tak naprawdę nie działała tak, jak chcę, więc ostatecznie użyłem czegoś takiego:
find -mindepth 2 -name '*.flac' -exec dirname {} \; | awk -F "/" '{print $2}' | sort -u | while read -r dirname; do cp -r "$dirname" "backup/"; done
w zasadzie wymieniam wszystkie pliki flac, odzyskuję folder główny za pomocą awk, usuwam duplikaty i robię, co chcę
źródło
Odpowiedzi:
Opcją jest użycie rsync, który kopiuje tylko pliki flac i zachowuje strukturę katalogów:
źródło
cześć mój przyjacielu możesz użyć
źródło
--parents
wcześniej nie używana !*/*.flac
! Czycp -r --parents AlbumName/ newdirectory/
nie wystarczy?shopt -s globstar
), a następnie użyć**/*.flac
dla glob. Podwójna gwiazda będzie pasować do zera lub więcej katalogów.Niezłe odpowiedzi
Chcę dodać jeszcze jeden sposób, możesz także użyć kombinacji find i cpio
find . -name "*.flac" -print0|cpio --null -pdm destination/
Można również użyć
rsync
lub napisać skrypt powłoki, aby znaleźć i skopiować pliki o strukturze katalogów.źródło
Odpowiedź 1: Możesz także użyć
find
polecenia do tego samego.Wyjaśnienie:
mkdir
tworzy nowy katalog.find
polecenie wyszukuje*.flac
pliki znajdujące się wAlbumName
folderze.exec
polecenie wykonujecp
polecenie dla każdejfind
zwróconej nazwy pliku .Odpowiedź 2: Można również użyć
find
polecenia zxargs
tak dobrzeWięcej informacji: znajdź , xargs
źródło
find | xargs
zepsuje nazwy plików spacjami, zamiastfind -print0 | xargs -0
tego użyj .1 2.flac
plikiem, który ma miejsce w nazwie pliku. Czy możesz podać nazwę pliku, w przypadku któregofind | xargs
wystąpił błąd?find -print0 | xargs -0
touch "a space" && find . | xargs ls
.Właśnie musiałem rozwiązać ten sam problem dla mojej biblioteki muzycznej i rozwiązać go za pomocą następującego dostosowanego skryptu. Nie zaprojektowałem go w pełni przy użyciu np. Zmiennych, ponieważ zamierzam go użyć tylko raz :).
Skrypt przenosi każdy katalog zawierający pliki flac, w tym wszystkie inne pliki i podkatalogi, do nowej lokalizacji za pomocą rsync. rsync pozwala wznowić skrypt, jeśli zatrzyma się podczas procesu.
Moja struktura biblioteki:
Nowa struktura biblioteki:
(1) uruchom następujący skrypt powłoki w miejscu docelowym SOURCE (zamień TARGET na odpowiedni katalog do wyboru - właśnie użyłem ścieżki bezwzględnej)
wiersz 1: znajdź wszystkie katalogi zawierające pliki flac i potok (|), które sortują w
wierszu 2: usuń duplikaty za pomocą sortowania i potoku, które wyświetlają się w
wierszu 3 do pętli : dla każdego katalogu wykonaj
wiersz 4: pokaż katalog w
wierszu procesu 5: rsync do katalogu docelowego plus usuń źródło i zachowaj strukturę (-R) w
wierszu 6 lokalizacji docelowej : usuń pusty katalog (ponieważ rsync usuwa tylko pliki)
(2) po pomyślnym wykonaniu skryptu w (1) możesz wykonać następującą komendę w katalogu źródłowym
To polecenie usuwa wszystkie puste katalogi, które nie zostały usunięte w skrypcie. Tzn. Katalogi „Artist”, w których wszystkie podfoldery / albumy zawierały pliki flac.
źródło