Se volessi copiare tutti i *.so
file da src
a dst
farei:
cp src/*.so dst
Tuttavia, voglio copiare tutti *.so
i file da src e IT di sottodirectory in dst
. Qualche indizio?
Se volessi copiare tutti i *.so
file da src
a dst
farei:
cp src/*.so dst
Tuttavia, voglio copiare tutti *.so
i file da src e IT di sottodirectory in dst
. Qualche indizio?
Risposte:
Provare:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
grep
modelli superano di gran lunga i semplici modelli di shell utilizzati nel -name
parametro find
. xargs
è anche molto più potente del -exec
parametro to find
.
Se stai usando Bash, puoi attivare l' globstar
opzione shell per abbinare ricorsivamente file e directory:
shopt -s globstar
cp src/**/*.so dst
Se devi trovare file i cui nomi iniziano con .
, e / o file dentro e sotto le directory i cui nomi iniziano con .
, imposta anche l' dotglob
opzione (es. Con shopt -s dotglob
). Puoi impostarli entrambi in un solo comando:
shopt -s globstar dotglob
Ho provato il comando suggerito da Mike:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
ma alla fine ha scaricato tutti i file nella directory dst
con i relativi percorsi persi.
Per mantenere i percorsi relativi, il comando deve essere modificato in questo modo:
find src/ -type f | grep -i so$ | xargs -i cp {} dst/{}
dst
. Nel caso non fosse così, utilizzare cp --parents
. Inoltre, assicurati di citare i nomi dei file. Pertanto: ... | xargs -i cp --parents "{}" dst
(si noti che l'ultimo argomento a cp
è ora "solo" la directory di destinazione). Il comando può essere reso ancora più breve (e probabilmente più veloce) con la -t
bandiera: ... | xargs cp --parents -t dst
.
... | xargs cp {} --parents -t dst.
--parents
non è disponibile. Ho usato ditto
al suo posto: stackoverflow.com/questions/11246070/cp-parents-option-on-mac
Un altro modo per farlo è così:
find src/ -type f -name "*.so" -exec cp {} dst/ \;
cp
processi: ... -exec cp -t dst/ {} +
.
-exec
con ;
, {}
è sostituito da un percorso alla volta. Ne ottieni uno separato cp
per ogni file. Con la +
sintassi find
sostituisce {}
con risultati multipli (fino a un limite definito dal sistema della lunghezza della riga di comando; restrizione: {}
deve essere l'ultima cosa prima +
, quindi cp -t
). Creare e terminare un processo è una cosa relativamente costosa. Per questo motivo è consigliabile utilizzarlo +
ogni volta che si prevedono molti risultati. In questo caso la copia di molti file potrebbe richiedere comunque molto tempo, quindi la differenza potrebbe passare inosservata; tuttavia è una buona pratica.
Il grep può essere sostituito usando find's -name :
find src/ -type f -name "*.so" | xargs -i cp {} dst/{}
find
può fare pattern matching ed eseguire comandi. Non è necessariofind src/ -type f -name '*.so' -exec cp '{}' dst/ ';'