ordenar archivos en diferentes directorios para un directorio principal

ordenar archivos en diferentes directorios para un directorio principal

Tengo numerosos archivos que intento mover desde un directorio principal a directorios separados que tienen varios subdirectorios dentro.

Ejemplo de convenciones de nomenclatura de archivos 1SA_1BA_1W.out, 2SA_3BA_3W.out, 4SA_2BA_5W.out.... ¿Hay alguna forma de, dado el número de entrada de cada SA, BA, W u otros elementos, que tengo que mover todos a la vez a una ubicación determinada? . Los rangos de SA serían 1-10, BA 1-4, etc. Actualmente estoy usando un 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

Tengo más de 1700 archivos con varias abreviaturas de identificación, como SA BA A HNO3 W MA EAM TMA DMA DEA, etc. Necesito poder extraer estos archivos y transferirlos a una estructura de base de datos sencilla. La "ubicación" sería el nombre del directorio principal principal y carpetas como SA_DEA_W son subdirectorios dentro del directorio principal.

Respuesta1

mv *SA_BA_W.out  /location/SA_BA_W;

mv *SA_DEA_W.out /location/SA_DEA_W

etcétera.

Respuesta2

Puede crear directorios una vez usando el siguiente comando:

Crear subdirectorios

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) }'

O

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) }'

O

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/{}

USTED PUEDE HACER AMBAS operaciones usando el siguiente bucle for

Para crear subdirectorios y mover los archivos a los directorios respectivos:

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

Respuesta3

Tu podrías intentar

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

Siempre que no tenga espacios en las rutas de sus archivos

Tutorial

Encuentra todos tus .outarchivos, y para cada uno-exec .... \;

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

El constructo

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

Toma cada nombre de archivo {}y lo pasa nuevamente al script como $1donde

Elimine la ruta del directorio hasta el último /y almacene comof

         f=${1##*/};

Quitar el .outsufijo

         f=${f%.out};

Calcule el directorio que desea y guárdelo comod

         d=./location/$f/;

Cree el directorio si no existe, junto con los padres.-p

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

haz el movimiento

         mv $1 $d'  sh {} \;

información relacionada