classificando arquivos em diretórios diferentes para um diretório principal

classificando arquivos em diretórios diferentes para um diretório principal

Tenho vários arquivos que estou tentando mover de um diretório principal para diretórios separados que possuem vários subdiretórios dentro.

Exemplo de convenções de nomenclatura de arquivo 1SA_1BA_1W.out, 2SA_3BA_3W.out, 4SA_2BA_5W.out.... Existe uma maneira dada o número de cada SA, BA, W ou outros itens que tenho para mover todos de uma vez para um determinado local . Os intervalos de SA seriam 1-10, BA 1-4 ect... Atualmente estou usando um comando de script como........

find . -type f -name '1A_1HNO3_W.out' | xargs -I {} cp '{}' /location/A_HNO3
find . -type f -name '2SA_BA_W.out' | xargs -I {} cp '{}' /location/SA_BA_W 
find . -type f -name '3SA_BA_W.out' | xargs -I {} cp '{}' /location/SA_BA_W 
find . -type f -name '4SA_BA_W.out' | xargs -I {} cp '{}' /location/SA_BA_W 
find . -type f -name '1SA_DEA_W.out' | xargs -I {} cp '{}' /location/SA_DEA_W 
find . -type f -name '2SA_DEA_W.out' | xargs -I {} cp '{}' /location/SA_DEA_W 
find . -type f -name '3SA_DEA_W.out' | xargs -I {} cp '{}' /location/SA_DEA_W 
find . -type f -name '4SA_DEA_*W.out' | xargs -I {} cp '{}' /location/SA_DEA_W

tenho mais de 1700 arquivos com diversas abreviações de identificação, como SA BA A HNO3 W MA EAM TMA DMA DEA ect... Preciso conseguir extrair esses arquivos e transferi-los para uma estrutura de banco de dados fácil. O "local" seria o nome do diretório pai principal e pastas como SA_DEA_W são subdiretórios dentro do diretório pai.

Responder1

mv *SA_BA_W.out  /location/SA_BA_W;

mv *SA_DEA_W.out /location/SA_DEA_W

e assim por diante.

Responder2

Você pode criar diretórios uma vez usando o comando abaixo:

Crie subdiretórios

ls *.out | sed -Ee 's/[0-9]*([A-Za-z]+)_([0-9]*[A-Za-z]+[0-9]*)_W.out$/\1_\2_W/g' | awk ' { system("mkdir -p /location/" $0) }'

OU

find . -regextype awk -regex './([0-9]*[A-Za-z])+_([0-9]*[A-Za-z]+[0-9]*)_W.out' | sed -Ee 's/[0-9]*([A-Za-z]+)_([0-9]*[A-Za-z]+[0-9]*)_W.out$/\1_\2_W/g' | awk '{ system("mkdir -p /location/" $0) }'

OU

find . -regextype awk -regex './([0-9]*[A-Za-z])+_([0-9]*[A-Za-z]+[0-9]*)_W.out' | sed -Ee 's/[0-9]*([A-Za-z]+)_([0-9]*[A-Za-z]+[0-9]*)_W.out$/\1_\2_W/g' | xargs -I {} mkdir -p /location/{}

VOCÊ PODE FAZER AMBAS as operações usando o loop for abaixo

Para criar subdiretórios e mover os arquivos para os respectivos diretórios:

for i in $(ls *.out)
do
DIR_NAME=$(echo $i | sed -Ee 's/[0-9]*([A-Za-z]+)_([0-9]*[A-Za-z]+[0-9]*)_W.out$/\1_\2_W/g')
test -d /location/$DIR_NAME || mkdir /location/$DIR_NAME
mv $i $DIR_NAME
done

Responder3

Você poderia tentar

find . -iname "*.out" -exec sh -c '
     f=${1##*/};
     f=${f%.out};
     d=./location/$f/;
     [ ! -d $f ] && mkdir -p $d;
     mv $1 $d'  sh {} \;

Desde que você não tenha espaços nos caminhos dos arquivos

Passo a passo

Encontre todos os seus .outarquivos e para cada um deles-exec .... \;

find . -iname "*.out" -exec sh -c '...script...` sh {} \; 

A construção

sh -c `...script......` sh {}

Pega cada nome de arquivo como {}e o passa de volta para o script como $1onde nós

Remova o caminho do diretório até o último /e armazene comof

         f=${1##*/};

Remova o .outsufixo

         f=${f%.out};

Calcule o diretório desejado e armazene-o comod

         d=./location/$f/;

Crie o diretório se ele não existir, junto com qualquer pai-p

         [ ! -d $d ] && mkdir -p $d;

Faça o movimento

         mv $1 $d'  sh {} \;

informação relacionada