сортировка файлов по разным каталогам для основного каталога

сортировка файлов по разным каталогам для основного каталога

У меня есть несколько файлов, которые я пытаюсь переместить из основного каталога в отдельные каталоги, внутри которых есть несколько подкаталогов.

Примеры соглашений об именовании файлов 1SA_1BA_1W.out, 2SA_3BA_3W.out, 4SA_2BA_5W.out.... Есть ли способ, учитывая количество входящих и исходящих SA, BA, W или других элементов, переместить все одновременно в заданное место. Диапазоны SA будут 1-10, BA 1-4 и т. д... В настоящее время я использую команду скрипта, такую ​​как........

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

есть более 1700 файлов с различными идентификационными сокращениями, такими как SA BA A HNO3 W MA EAM TMA DMA DEA и т. д... Мне нужно иметь возможность извлечь эти файлы и перенести их в простую структуру базы данных. "Расположение" будет именем основного родительского каталога, а папки типа SA_DEA_W являются подкаталогами внутри родительского каталога.

решение1

mv *SA_BA_W.out  /location/SA_BA_W;

mv *SA_DEA_W.out /location/SA_DEA_W

и так далее.

решение2

Вы можете создать каталоги один раз, используя следующую команду:

Создать подкаталоги

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

ИЛИ

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

ИЛИ

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

ВЫ МОЖЕТЕ ВЫПОЛНИТЬ ОБЕ ОПЕРАЦИИ, используя цикл for ниже

Чтобы создать подкаталоги и переместить файлы в соответствующие каталоги:

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

решение3

Вы можете попробовать

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

При условии, что в путях к файлам нет пробелов.

Прохождение

Найдите все ваши .outфайлы и для каждого из них-exec .... \;

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

Конструкция

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

Берет каждое имя файла как {}и передает его обратно в скрипт как $1мы

Удалить путь к каталогу до последнего /и сохранить какf

         f=${1##*/};

Удалить .outсуффикс

         f=${f%.out};

Рассчитайте нужный вам каталог и сохраните его какd

         d=./location/$f/;

Создайте каталог, если он не существует, вместе с родителями.-p

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

Сделай ход

         mv $1 $d'  sh {} \;

Связанный контент