Mover recursivamente arquivos em sub-dirs para novas sub-dirs de mesmo nome

2

Eu tenho um lote de arquivos todos terminando com a mesma string, ou seja: *_ext.dat localizado em vários sub-diretórios junto com vários outros arquivos, em um determinado diretório principal. Esta é a estrutura:

/main_dir/subdir1/file11_ext.dat
/main_dir/subdir1/file12_ext.dat
/main_dir/subdir1/file13_ext.dat
/main_dir/subdir1/file14_other.dat
/main_dir/subdir1/file15_other.dat

/main_dir/subdir2/file21_ext.dat
/main_dir/subdir2/file22_ext.dat
/main_dir/subdir2/file23_ext.dat
/main_dir/subdir2/file24_other.dat
/main_dir/subdir2/file25_other.dat

/main_dir/subdir3/file31_ext.dat
/main_dir/subdir3/file32_ext.dat
/main_dir/subdir3/file33_ext.dat
/main_dir/subdir3/file34_other.dat
/main_dir/subdir3/file35_other.dat

Eu preciso recursivamente mover somente os arquivos que terminam em *_ext.dat em um novo diretório principal, new_dir , respeitando a estrutura da subdiretório para que os arquivos acabem em uma estrutura dir equivalente assim:

/new_dir/subdir1/file11_ext.dat
/new_dir/subdir1/file12_ext.dat
/new_dir/subdir1/file13_ext.dat

/new_dir/subdir2/file21_ext.dat
/new_dir/subdir2/file22_ext.dat
/new_dir/subdir2/file23_ext.dat

/new_dir/subdir3/file31_ext.dat
/new_dir/subdir3/file32_ext.dat
/new_dir/subdir3/file33_ext.dat

Devido a isso, o comando também deve criar as sub-pastas com seus nomes correspondentes. Eu sei que com uma linha como esta:

find . -name "*_ext.dat" -print0 | xargs -0 rm -rf

Eu posso deletar todos esses arquivos, mas não sei como modificá-lo para fazer o que eu preciso (ou se é mesmo possível).

    
por Gabriel 09.10.2013 / 01:55

1 resposta

1

Primeiro, criaria os subdiretórios em new_dir por

cd main_dir
for i in *; do mkdir "../new_dir/$i"; done
cd ..

Em seguida, você pode usar o comando bash ' for novamente com a expansão de padrões para fazer exatamente o que precisa rapidamente:

for i in main_dir/*/*_ext.dat; do cp "$i" "new_dir${i##main_dir}"; done

usando o fato de que os diretórios de destino existem. Por fim, se não tiver certeza de que cada deles seria realmente usado, você poderá remover os vazios depois:

cd new_dir
rmdir --ignore-fail-on-non-empty *
    
por 11.11.2013 / 02:37