#arrays #bash #shell #loops #unix
#массивы #bash #оболочка #циклы #unix
Вопрос:
У нас есть службы, которые генерируют файлы с именами модулей. Например, модуль acqDou генерирует
acqDou_0001.out
acqDou_08981.out
acqDou_23423.out
acq_cheat
Модуль генерирует файлы с почти одинаковыми именами, но последняя нумерация немного отличается.
Мое требование заключается в том, чтобы настроить эти файлы на основе имен модулей, по одному tar-файлу на модуль, например, acqDou.tar
и acq_cheat.tar
Ниже приведена программа, которую я принял:
cd /home/swap/output/outfiles
for i in *;
do
j=`echo $i | grep -v 'out$'`
if [ -z $j ];
then continue;
fi
count1=$(echo $i | tr -d -c '_' | wc -m)
if [ $count1 -eq 2 ]
then
two=`ls -1 $i | cut -d'_' -f2 | cut -d'.' -f1 | uniq`
else
two=`ls -1 $i | cut -d'_' -f1 | cut -d'.' -f1 | uniq`
fi
_FILE="${_FILE} $two"
done
_FILE2=`echo "${_FILE[@]}" | tr ' ' 'n' | sort -u | tr 'n' ' '`
echo "${_FILE2}"
for m in "${_FILE2}"
do
ls -lrt *${m}*.x
tar -cpf $m.tar /home/swap/output/outfiles/*${m}*
done
}
Комментарии:
1. Пожалуйста, укажите, что вы пытались, чтобы вы могли получить помощь в оптимизации / исправлении. Этот сайт не предназначен для предоставления вам программ.
2. Фазлин, я вставил здесь код попытки. В первом цикле будут ключевые слова для поиска имени файла. Также полезно указать имя файла tar. Второй цикл — попытка создания файла tar. Но это не работает.
Ответ №1:
В случае, если вы можете различать файлы по их имени, решение может быть таким простым и понятным:
tar cf acqDou.tar acqDou*.out*
tar cf acq_cheat.tar acq_cheat*.out*
Если таких модулей несколько, вы даже можете применить простой цикл for для их обработки:
for m in acqDou acq_cheat
do
tar cf $m.tar ${m}*.out*
done
Комментарии:
1. У меня проблема с этим циклом for . имя файла — acqDou_12345.out.1 Этот синтаксис tar здесь не работает.
2. Я понимаю. Затем вы должны установить маску так, чтобы она соответствовала вашим именам файлов. Например: tar cf $m.tar ${m}*.out*
Ответ №2:
Создание tars для всех возможных типов модулей, присутствующих в каталоге — одним выстрелом.
допустим, у вас есть модули с именами .. acqDou, acqDumb, acqcheat, acqfunny — в формате module_XXXX.out.
что-то, что может выглядеть так, как показано ниже. Итак, я получил 4 модуля и 500 файлов каждого из них в каталоге. Все они пусты, но это не имеет значения.
>Wed Oct 05|01:15:13|gaurav@[STATION]:/root/ga/scripts/temp/tmp % ls -lrtha *.out|head -7 ; echo ; ls -lrtha |tail -8
-rw-rw-r--. 1 gaurav gaurav 0 Oct 5 00:58 acqDou_0.out
-rw-rw-r--. 1 gaurav gaurav 0 Oct 5 00:58 acqDumb_0.out
-rw-rw-r--. 1 gaurav gaurav 0 Oct 5 00:58 acqcheat_0.out
-rw-rw-r--. 1 gaurav gaurav 0 Oct 5 00:58 acqfunny_0.out
-rw-rw-r--. 1 gaurav gaurav 0 Oct 5 00:58 acqDou_1.out
-rw-rw-r--. 1 gaurav gaurav 0 Oct 5 00:58 acqDumb_1.out
-rw-rw-r--. 1 gaurav gaurav 0 Oct 5 00:58 acqcheat_1.out
-rw-rw-r--. 1 gaurav gaurav 0 Oct 5 00:58 acqDumb_498.out
-rw-rw-r--. 1 gaurav gaurav 0 Oct 5 00:58 acqcheat_498.out
-rw-rw-r--. 1 gaurav gaurav 0 Oct 5 00:58 acqfunny_498.out
-rw-rw-r--. 1 gaurav gaurav 0 Oct 5 00:58 acqDou_499.out
-rw-rw-r--. 1 gaurav gaurav 0 Oct 5 00:58 acqDumb_499.out
-rw-rw-r--. 1 gaurav gaurav 0 Oct 5 00:58 acqcheat_499.out
-rw-rw-r--. 1 gaurav gaurav 0 Oct 5 00:58 acqfunny_499.out
drwxrwxr-x. 2 gaurav gaurav 64K Oct 5 01:14 .
>Wed Oct 05|01:15:30|gaurav@[STATION]:/root/ga/scripts/temp/tmp %
Для достижения цели:
мы можем перечислить файлы, удалить номера (используя sed), отсортировать и унифицировать список (который дает возможные имена существующих модулей в каталоге), а затем передать его в цикл while, чтобы читать имена модулей один за другим .. а затем сгенерировать наш выходной tarfile, имя модуля иналичие файлов только этого модуля.
Вот команда:
ls *.out |sed 's/[0-9]//g'|sort|uniq|sed 's/_.out//g'|while read module
do
tar -cvf ${module}.tar ${module}*
done
Мы получим что-то вроде этого, как только закончим.
>Wed Oct 05|01:16:43|gaurav@[STATION]:/root/ga/scripts/temp/tmp % ls -lrth *.tar
-rw-rw-r--. 1 gaurav gaurav 260K Oct 5 01:16 acqcheat.tar
-rw-rw-r--. 1 gaurav gaurav 260K Oct 5 01:16 acqDou.tar
-rw-rw-r--. 1 gaurav gaurav 260K Oct 5 01:16 acqDumb.tar
-rw-rw-r--. 1 gaurav gaurav 260K Oct 5 01:16 acqfunny.tar
>Wed Oct 05|01:16:48|gaurav@[STATION]:/root/ga/scripts/temp/tmp %
создано 4 файла tar с именами их модулей. И он содержит соответствующие файлы модулей. Давайте посмотрим, используя команду tar -tvf . Я буду запускать его для всех файлов tar и просто принимать 2 строки в качестве выходных данных для каждого файла.
>Wed Oct 05|01:18:29|gaurav@[STATION]:/root/ga/scripts/temp/tmp % ls *.tar|while read file
do
echo ;echo "Looking inside file: $file"
tar -tvf $file|head -2
done
Looking inside file: acqcheat.tar
-rw-rw-r-- gaurav/gaurav 0 2016-10-05 00:58 acqcheat_0.out
-rw-rw-r-- gaurav/gaurav 0 2016-10-05 00:58 acqcheat_100.out
Looking inside file: acqDou.tar
-rw-rw-r-- gaurav/gaurav 0 2016-10-05 00:58 acqDou_0.out
-rw-rw-r-- gaurav/gaurav 0 2016-10-05 00:58 acqDou_100.out
Looking inside file: acqDumb.tar
-rw-rw-r-- gaurav/gaurav 0 2016-10-05 00:58 acqDumb_0.out
-rw-rw-r-- gaurav/gaurav 0 2016-10-05 00:58 acqDumb_100.out
Looking inside file: acqfunny.tar
-rw-rw-r-- gaurav/gaurav 0 2016-10-05 00:58 acqfunny_0.out
-rw-rw-r-- gaurav/gaurav 0 2016-10-05 00:58 acqfunny_100.out
>Wed Oct 05|01:18:42|gaurav@[STATION]:/root/ga/scripts/temp/tmp %
У нас действительно есть 500 файлов в каждом файле tar. Давайте просто подтвердим это тоже.
>Wed Oct 05|01:18:42|gaurav@[STATION]:/root/ga/scripts/temp/tmp % ls *.tar|while read file
do
echo ; echo "File count in tar file: $file"
tar -tvf $file|wc -l
done
File count in tar file: acqcheat.tar
500
File count in tar file: acqDou.tar
500
File count in tar file: acqDumb.tar
500
File count in tar file: acqfunny.tar
500
>Wed Oct 05|01:20:03|gaurav@[STATION]:/root/ga/scripts/temp/tmp %
Приветствия,
Gaurav
Комментарии:
1. С некоторыми изменениями в качестве моего требования. Это сработало. Огромное спасибо Gaurav