Тар (или архив) папок, которые содержат определенные c файлы и переносятся в другой каталог - PullRequest
1 голос
/ 07 января 2020

Я ищу tar или архивирую много данных, чтобы перенести их в новое место в Ubuntu 16LTS.

Структура данных:

Directory
├── docs
├── results
│   └── results.txt
├── participant_A1
│   ├── sequence_1
│   │   ├── xyz.IMA
│   │   ├── xyz2.IMA
│   │   ├── xyz3.IMA
│   │   └── ...IMA
│   ├── sequence_2
│   │   ├── xyz2.IMA
│   │   ├── xyz3.IMA
│   │   └── ...IMA  
│   
├── participant_B2
│   ├── sequence_3
│   │   ├── xyz.IMA
│   │   ├── xyz2.IMA
│   │   ├── xyz3.IMA
│   │   └── ...IMA
│   ├── sequence_4
│   │   ├── xyz2.IMA
│   │   ├── xyz3.IMA
│   │   └── ...IMA
│   │   ...etc

Моя проблема заключается в том, что мне нужно архивировать папки, содержащие файлы .IMA, перед rsyn c 'из-за ограничений на иноды.

  • Я хочу сохранить структуру данных нетронутой.
  • Я хочу скопировать все файлы * .IMA для каждого подкаталога и сохранить архив в их папках (в каждой последовательности их несколько тысяч).
  • Названы все «участники» в случайном порядке.
  • Имя «последовательности» также может изменяться между участниками.
  • Остальные данные можно передавать без архивирования.

Я полагаю, что могу сделать что-то вроде: find / -type f -name "*IMA" -exec tar -rf archive.tar '{}' \;, но я не знаю, как сохранить структуру данных без изменений с именами переменных папок.

Ожидаемый результат:

Directory
├── docs
├── results
│   └── results.txt
├── participant_A1
│   ├── sequence_1.tar.gz
│   ├── sequence_2.tar.gz
│   
├── participant_B2
│   ├── sequence_3.tar.gz
│   ├── sequence_4.tar.gz
│   │   ...etc

1 Ответ

0 голосов
/ 16 января 2020

Это мое не элегантное решение. Это будет go в каталог (in_dir), а затем искать в этом каталоге любые каталоги, которые содержат файлы .IMA. Каждая папка, содержащая IMA, будет заархивирована. Весь каталог верхнего уровня отправляется в $ out_dir, за исключением папок, которые содержат файлы .IMA (с использованием флага --exclude tar). Затем архивные папки удаляются для экономии места.

#!/bin/bash
in_dir=~/test_in_dir
out_dir=~/test_out_dir

Найдите все папки, в которых есть файлы IMA

find ${in_dir} -name '*.IMA' -printf '%h\n' | sort -u

L oop, по каталогам и превратите их в массив

cd $in_dir
i=0
shopt -s dotglob
shopt -s nullglob
array=(`find . -name '*.IMA' -printf '%h\n' | sort -u`)
for dir in "${array[@]}" ; do
    echo "$dir"
    (( i++))
done

L oop через массив $ i количество раз и tar каждой папки, как вы это делаете.

j=0
while ((j < $i)) ; do
    cd $in_dir
    cd ${array[$j]}
    folder=${PWD##*/}
    cd ../
    tar cfz ${folder}.tar.gz ${folder}/*
    (( j++ ))
done

Отправка всего каталога в out_dir, но исключая все каталоги в массиве

exclude_options=()
for x in "${array[@]}"; do
  exclude_options+=(--exclude="$x")
done
cd $in_dir
tar -czvf $out_dir/transferred_from_in.tar.gz "${exclude_options[@]}" ./

rm все файлы tar в in_dir для экономии места

for y in "${array[@]}"; do
    rm -r ${y}.tar.gz  
done
...