
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 .out
arquivos 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 $1
onde nós
Remova o caminho do diretório até o último /
e armazene comof
f=${1##*/};
Remova o .out
sufixo
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 {} \;