Se eu quisesse copiar todos os *.so
arquivos de src
para dst
eu faria:
cp src/*.so dst
No entanto, quero copiar todos os *.so
arquivos do src e subdividi-los em dst
. Alguma pista?
Se eu quisesse copiar todos os *.so
arquivos de src
para dst
eu faria:
cp src/*.so dst
No entanto, quero copiar todos os *.so
arquivos do src e subdividi-los em dst
. Alguma pista?
Respostas:
Experimentar:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
grep
padrões superam em muito os padrões de shell simples usados no -name
parâmetro para find
. xargs
é também muito mais poderoso do que o -exec
parâmetro para find
.
Se você estiver usando o Bash, poderá ativar a globstar
opção shell para corresponder arquivos e diretórios recursivamente:
shopt -s globstar
cp src/**/*.so dst
Se você precisar encontrar arquivos cujos nomes começam com .
e / ou arquivos nos diretórios cujos nomes começam com .
, defina dotglob
também a opção (por exemplo, com shopt -s dotglob
). Você pode definir os dois em um comando:
shopt -s globstar dotglob
Eu tentei o comando sugerido por Mike:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
mas acabou despejando todos os arquivos no diretório dst
com seus caminhos relativos perdidos.
Para manter os caminhos relativos, o comando precisa ser modificado para isso:
find src/ -type f | grep -i so$ | xargs -i cp {} dst/{}
dst
. Caso não seja assim, use cp --parents
. Além disso, não se esqueça de citar os nomes dos arquivos. Assim: ... | xargs -i cp --parents "{}" dst
(observe que o último argumento para cp
agora é "apenas" o diretório de destino). O comando pode ser feita ainda mais curto (e provavelmente mais rápido) usando a -t
bandeira: ... | xargs cp --parents -t dst
.
... | xargs cp {} --parents -t dst.
--parents
não está disponível. Eu usei ditto
em seu lugar: stackoverflow.com/questions/11246070/cp-parents-option-on-mac
Outra maneira de fazer isso é assim:
find src/ -type f -name "*.so" -exec cp {} dst/ \;
cp
processos: ... -exec cp -t dst/ {} +
.
-exec
com ;
, {}
é substituído por um caminho por vez. Você recebe um separado cp
para cada arquivo. A +
sintaxe find
substitui {}
por vários resultados (até um limite definido pelo sistema de comprimento da linha de comando; restrição: {}
deve ser a última coisa antes +
, portanto cp -t
). Criar e encerrar um processo é algo relativamente caro. Por esse motivo, é bom usar +
sempre que você espera muitos resultados. Nesse caso, a cópia de muitos arquivos pode levar muito tempo, portanto a diferença pode passar despercebida; no entanto, é uma boa prática.
O grep pode ser substituída por utilizar do achado -name :
find src/ -type f -name "*.so" | xargs -i cp {} dst/{}
find
pode fazer a correspondência de padrões e executar comandos. Não há necessidade de canalizar sua saída:find src/ -type f -name '*.so' -exec cp '{}' dst/ ';'