Se eu quisesse copiar todos os *.soarquivos de srcpara dsteu faria:
cp src/*.so dst
No entanto, quero copiar todos os *.soarquivos do src e subdividi-los em dst. Alguma pista?
Se eu quisesse copiar todos os *.soarquivos de srcpara dsteu faria:
cp src/*.so dst
No entanto, quero copiar todos os *.soarquivos do src e subdividi-los em dst. Alguma pista?
Respostas:
Experimentar:
find src/ -type f | grep -i so$ | xargs -i cp {} dst
greppadrões superam em muito os padrões de shell simples usados no -nameparâmetro para find. xargsé também muito mais poderoso do que o -execparâ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 dotglobtambé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 dstcom 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 cpagora é "apenas" o diretório de destino). O comando pode ser feita ainda mais curto (e provavelmente mais rápido) usando a -tbandeira: ... | xargs cp --parents -t dst.
... | xargs cp {} --parents -t dst.
--parentsnão está disponível. Eu usei dittoem 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/ \;
cpprocessos: ... -exec cp -t dst/ {} +.
-execcom ;, {}é substituído por um caminho por vez. Você recebe um separado cppara cada arquivo. A +sintaxe findsubstitui {}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/{}
findpode 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/ ';'