оболочка unix: создание разных tar-файлов с использованием строки в массиве

#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