Substituir grupo de arquivos mantendo o caminho

1

Eu tenho o diretório A e B . Cada um deles contém outro diretório com item.json dentro. Apenas o arquivo item.json é persistente nos diretórios, portanto, não consigo copiar e colar os diretórios.

A:

./path/Item A/item.json
./path/Item B/item.json
...
./path/Item Z/item.json

B:

./new/Item A/item.json
./new/Item B/item.json
...
./new/Item Z/item.json

Como devo copiar todos os arquivos item.json de ./path/ para as pastas apropriadas em ./new ?

Minha solução:

Para obter diretórios

ls -l ./path | grep "^d" | cut -d' ' -f 16

Então eu posso usar os resultados como:

for i in 'ls -l ./path | grep "^d" | cut -d' ' -f 16'; echo "Dir: $i"; done

Então eu posso fazer cp com eles

for i in 'ls -l ./path | grep "^d" | cut -d' ' -f 16'; cp "$i/item.json" "../new/$i/item.json" ; done

E esta solução está ok, mas acredito que há uma maneira muito mais elegante.

    
por lukas.pukenis 17.02.2015 / 11:08

3 respostas

1

Sua solução está bem! Se você gosta de ver alternativas, minha sugestão é apenas cp !

Eu presumo que você queira copiar apenas os arquivos "item.json" e que você pode ter outros conteúdo não deve ser copiado.

cd path; cp --parents */item.json ../new
    
por 17.02.2015 / 13:05
2

Abaixo de um forro deve ajudá-lo com isso.

$ find ./path/ -type f -exec bash -c 'cp $0 ${0/path/new}' {} \;

Aqui, o comando find procura todo o arquivo de texto no diretório ./path/ . Quando um arquivo é encontrado, ele invoca um pequeno script bash que copia esse arquivo para o diretório /new/ de destino apenas substituindo a string de path para new .

Espero que isso ajude você.

    
por 17.02.2015 / 11:39
1

Use cpio (ou tar , mas IMHO é mais lento e não tem -p como o cpio)! Ele mantém permissões, datas, etc. (se solicitado) e, claro, mantém a estrutura de diretório.

ou seja: cd path ; find . | cpio -pvmd ../new

    
por 17.02.2015 / 15:21