Mover arquivo específico de todos os subdiretórios e renomear com base no subdiretório

1

Eu tenho uma estrutura de pastas em um diretório que é algo como:

/ 
A, B/Subdir Level 1/ Subdir L2/Folder A/abc.json
A, C/Subdir Level 1/ Subdir L2/Folder A/abc.json
A, D/Subdir Level 1/ Subdir L2/Folder A/abc.json 
A, F/Subdir Level 1/ Subdir L2/Folder A/abc.json 
A, G/Subdir Level 1/ Subdir L2/Folder A/abc.json 
B, Z/Subdir Level 1/ Subdir L2/Folder A/abc.json 
C, F/Subdir Level 1/ Subdir L2/Folder A/abc.json

Eu quero copiar todos os arquivos abc.json e colocá-los em uma pasta New_Folder, mas renomeá-los no processo para que eu saiba de onde cada abc.json veio.

New_Folder/ 
A, B_abc.json (or A, Babc.json...don't really care as long as A, B appear) 
A, C_abc.json 
A, D_abc.json 

..... e assim por diante

Como posso conseguir isso com um script de shell? Eu uso o Ubuntu 14.04

    
por srr 19.09.2015 / 23:21

1 resposta

0

Isso presume que você já tenha cd no nível que deseja manter no nome. Você pode verificar novamente usando find :

find -type f -iname abc.json
./A, B/Subdir Level 1/Subdir L2/abc.json
./A, C/Subdir Level 1/Subdir L2/abc.json
./A, F/Subdir Level 1/Subdir L2/abc.json

Supondo que você já tenha feito a pasta ../NewFolder, o comando a seguir deve copiar todos os arquivos json e colocar o subdiretório de primeiro nível no novo nome. Apenas cole todas as 4 linhas no seu terminal de uma só vez!

find -type f -iname \*.json | while read x; do
 dirname="$(echo "$x" | sed -r 's_^\.?/?__;s_/.*__')";
filename="$(echo "$x" | sed -r 's_.*/__')";
cp -v "$x" "../NewFolder/$dirname - $filename"; done

‘./A, B/Subdir Level 1/Subdir L2/abc.json’ -> ‘../NewFolder/A, B - abc.json’
‘./A, C/Subdir Level 1/Subdir L2/abc.json’ -> ‘../NewFolder/A, C - abc.json’
‘./A, F/Subdir Level 1/Subdir L2/abc.json’ -> ‘../NewFolder/A, F - abc.json’
    
por 19.09.2015 / 23:38