Come copiare tutte le cartelle che contengono un file specifico

17

Voglio eseguire il backup solo delle mie cartelle musicali FLAC. I file FLAC possono essere nidificati come quello all'interno delle cartelle:

AlbumName/
├── Files/
│   ├── someSong01.flac
│   ├── someSong02.flac
├── Covers/
│   ├── someCover01.jpg
│   └── someCover02.jpg

Come faccio a copiare e spostare tutte le cartelle di AlbumName con la struttura e il contenuto corrispondenti che contengono da qualche parte all'interno di almeno un file FLAC (presumo che sia sufficiente dire: la musica è in formato FLAC)

Modifica I file FLAC potrebbero essere annidati; quindi posso avere:

AlbumName2/
├── someSong01.flac
├── someSong02.flac
├── Covers/
│   ├── someCover01.jpg
|   └── someCover02.jpg

E voglio copiare quelle cartelle con tutti i loro contenuti, non solo i file FLAC, e incollarli in un'altra directory.

Quindi se ho anche

AlbumName3/
├── someSong01.mp3
├── someSong02.mp3
├── Covers/
│   ├── someCover01.jpg
|   └── someHiddenSong.flac

e

AlbumName4/
├── Files/
│   ├── someSong01.mp3
│   ├── someSong02.mp3
├── Covers/
│   ├── someCover01.jpg
│   └── someCover02.jpg

Voglio criptare ricorsivamente in un'altra directory, AlbumName, AlbumName2 e AlbumName3, ma non AlbumName4

Modifica Nessuna delle risposte stava facendo veramente quello che volevo, quindi ho finito per usare qualcosa del genere:

 find -mindepth 2 -name '*.flac' -exec dirname {} \; | awk -F "/" '{print $2}' | sort -u | while read -r dirname; do cp -r "$dirname" "backup/"; done

in pratica elenco tutti i file flac, recupero la cartella radice usando awk, cancello i duplicati e faccio ciò che voglio

    
posta fricadelle 21.12.2017 - 09:08

5 risposte

19

Un'opzione è usare rsync, che copia solo i file flac e conserva la struttura delle directory:

rsync -avzm --include=*/ --include=*.flac --exclude=* albums/ backup/
  • un archivio
  • v verbose
  • z comprime durante il trasferimento (potrebbe non essere utile copiare sullo stesso computer)
  • m sfoltisci le directory vuote
  • prima include include tutte le directory
  • include la seconda include i file flac
  • l'ultima esclusione esclude tutti gli altri file
risposta data nobody 21.12.2017 - 09:49
9

Ciao amico puoi usare

mkdir newdirectory
cp -r --parents */*.flac newdirectory/
    
risposta data amir.m ghazanfari 21.12.2017 - 09:25
5

Belle risposte

Voglio aggiungere un altro modo, puoi anche utilizzare una combinazione di Trova e cpio

find . -name "*.flac" -print0|cpio --null -pdm destination/

% Bl0ck_qu0te%
  • Opzioni Utilizzato nel comando precedente:
% Bl0ck_qu0te%

Si può anche usare rsync o scrivere uno script di shell per trovare e copiare file con la struttura di directory.

% Bl0ck_qu0te%     
risposta data Neeraj Pal 21.12.2017 - 10:07
4

Risposta 1: puoi anche usare find comando per lo stesso.

mkdir newDir && find AlbumName/ -iname "*.flac" -exec cp --parents "{}" newDir/ \;

Spiegazione:

mkdir crea una nuova directory. Il comando find trova i file *.flac che si trovano nella cartella AlbumName . Il comando exec esegue il comando cp su ciascun nome file restituito da find .

Risposta 2: puoi anche usare find comando anche con xargs

mkdir newDir && find AlbumName/ -iname "*.flac" | xargs -I{} cp --parents {} newDir/

Ulteriori informazioni: trova , xargs

    
risposta data mf_starboi_8041 21.12.2017 - 09:45
0

Ho appena avuto il compito di risolvere lo stesso problema per la mia libreria musicale e l'ho risolto usando il seguente script adattato. Non l'ho completamente ingegnerizzato con le variabili, dato che intendo utilizzarlo solo una volta:).

Lo script sposta ogni directory contenente i file flac inclusi tutti gli altri file e sottodirectory in una nuova posizione usando rsync. rsync ti permette di riprendere lo script se si ferma durante il processo.

Struttura della mia biblioteca:

library
|-artist
  |- album 1 (mp3)
  |- album 2 (flac)

Nuova struttura della libreria:

library
|-artist
  |- album 1 (mp3)

library-lossless
|-artist
  |- album 2 (flac)

(1) avvia il seguente script di shell nella destinazione SOURCE (sostituisci TARGET con la rispettiva directory di tua scelta - Ho appena usato il percorso assoluto)

riga 1: trova tutte le directory contenenti i file flac e pipe (|) in ordine
riga 2: rimuovere i duplicati con l'ordinamento e instradare l'elenco nel ciclo do
riga 3: per ogni directory fare riga 4: mostra la directory in elaborazione
riga 5: rsync alla directory di destinazione, oltre a rimuovere l'origine e conservare la struttura (-R) nella posizione di destinazione
riga 6: rimuovi la directory vuota (dato che rsync rimuove solo i file)

find . -type f -name \*.flac -printf "%h\n" | 
sort -u | 
while read -r dirname; do
    echo $dirname
    rsync -azvm -R --remove-source-files "${dirname}" TARGET
    find "${dirname}" -type d -delete
done

(2) dopo aver eseguito con successo lo script in (1) è possibile eseguire il seguente comando nella directory di origine

find . -depth -type d -empty -delete

Questo comando cancella tutte le directory vuote non eliminate all'interno dello script. Cioè Directory "Artist", in cui tutte le sottocartelle / album includevano file flac.

    
risposta data wundabua 25.12.2017 - 20:55

Leggi altre domande sui tag