Se volessi copiare tutti i *.sofile da srca dstfarei:
cp src/*.so dst
Tuttavia, voglio copiare tutti *.soi file da src e IT di sottodirectory in dst. Qualche indizio?
Se volessi copiare tutti i *.sofile da srca dstfarei:
cp src/*.so dst
Tuttavia, voglio copiare tutti *.soi file da src e IT di sottodirectory in dst. Qualche indizio?
Risposte:
Provare:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
grepmodelli superano di gran lunga i semplici modelli di shell utilizzati nel -nameparametro find. xargsè anche molto più potente del -execparametro 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' dotglobopzione (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 dstcon 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 -tbandiera: ... | xargs cp --parents -t dst.
... | xargs cp {} --parents -t dst.
--parentsnon è disponibile. Ho usato dittoal 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/ \;
cpprocessi: ... -exec cp -t dst/ {} +.
-execcon ;, {}è sostituito da un percorso alla volta. Ne ottieni uno separato cpper ogni file. Con la +sintassi findsostituisce {}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/{}
findpuò fare pattern matching ed eseguire comandi. Non è necessariofind src/ -type f -name '*.so' -exec cp '{}' dst/ ';'