Come puoi spostare (o copiare) tutti i file di un certo tipo in una directory in Unix?


22

Non ho ancora molta familiarità con tutti i trucchi di grep/find/awk/xargs.

Ho alcuni file che corrispondono a un modello particolare, diciamo *.xxx. Questi file si trovano in posizioni casuali in una determinata directory. Come posso trovare tutti questi file e spostarli in una cartella nella mia home directory su Unix (che potrebbe non esistere ancora)?


4
Devi fare attenzione quando parli di "tipo di file". Negli ambienti unixy, l'esempio ".xxx" non è nemmeno un'estensione in senso Windows. ".xxx" costituisce solo un suffisso del nome del file. Il "tipo di file" è più di una delle poche categorie: file normale, file del dispositivo, collegamento simbolico, directory, named pipe, socket della famiglia Unix, forse alcune altre.
Bruce Ediger,


@BruceEdiger grazie credo che intendessi davvero "nome file"
qodeninja,

Risposte:


22
mkdir ~/dst
find source -name "*.xxx" -exec mv -i {} -t ~/dst \;

1
Vorrei usaremv -i -t ~/dst {} +
enzotib il

17

Se vuoi spostare tutti i file all'interno di una gerarchia di directory in una singola directory di destinazione, in bash ≥4 (inserisci il shopt -s globstartuo ~/.bashrc) o zsh:

mkdir ~/new-directory
mv -i **/*.xxx ~/new-directory

In altre conchiglie:

mkdir ~/new-directory
find . -name '*.xxx' -exec mv -i {} ~/new-directory \;

Come leggere questo findcomando:

  • .: attraversa la directory corrente
  • -name '*.xxx': agisce sui file il cui nome corrisponde a questo modello
  • -exec … \;: esegue questo comando su ciascun file, sostituendolo {}con il percorso del file

C'è un comando più complesso findche usa più veloce se hai molti file in quanto non è necessario invocare un mvprocesso separato per ogni file:

find . -name '*.xxx' -exec sh -c 'mv -i "$@" "$0"' ~/new-directory {} +

Alla +fine dice finddi invocare il comando su più file alla volta. Dal momento che findpuò solo mettere i nomi dei file alla fine della riga di comando e mvdeve avere la directory di destinazione per ultima, usiamo una shell intermedia per riordinare gli argomenti ( "$0"è il primo argomento della shell ~/new-directory, e "$@"sono gli argomenti successivi che provengono da findl'espansione di {}).


4

Se vuoi replicare la struttura di directory dei file sorgente corrispondenti nella nuova directory di destinazione, puoi usare l' opzione --parents di GNU cp :

mkdir /path/to/target_dir
cd source_dir
find . -name '*.xxx' -exec cp -iv --parents -t /path/to/target_dir {} +

3

è possibile utilizzare trovare a colpo -exec‍così:

mkdir /path/to/dest    
cp `find /path/to/source -name "*.jar"` /path/to/dest

1
Si noti tuttavia che find -execè molto più sicuro; quanto sopra fallirà sui nomi di file contenenti spazi bianchi, ad esempio.
dhag,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.