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?
Experimentar:
find src/ -type f | grep -i 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/ ';'
grep
padrões superam em muito os padrões de shell simples usados no-name
parâmetro parafind
.xargs
é também muito mais poderoso do que o-exec
parâmetro parafind
.Se você estiver usando o Bash, poderá ativar a
globstar
opção shell para corresponder arquivos e diretórios recursivamente:Se você precisar encontrar arquivos cujos nomes começam com
.
e / ou arquivos nos diretórios cujos nomes começam com.
, definadotglob
também a opção (por exemplo, comshopt -s dotglob
). Você pode definir os dois em um comando:fonte
Eu tentei o comando sugerido por Mike:
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:
fonte
dst
. Caso não seja assim, usecp --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 paracp
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 useiditto
em seu lugar: stackoverflow.com/questions/11246070/cp-parents-option-on-macOutra maneira de fazer isso é assim:
fonte
cp
processos:... -exec cp -t dst/ {} +
.-exec
com;
,{}
é substituído por um caminho por vez. Você recebe um separadocp
para cada arquivo. A+
sintaxefind
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+
, portantocp -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 :
fonte