我正在寻找tar或存档大量数据,以将其传输到Ubuntu16LTS上的一个新位置。
数据结构:
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我的问题是,由于inode的限制,在rsync之前,我需要存档包含.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发布于 2020-01-16 01:47:50
这是我不雅的解决办法。这将进入目录(in_dir),然后搜索该目录中包含.IMA文件的任何目录。每个包含IMA的文件夹都将被归档。整个顶级目录被发送到$out_dir,不包括.IMA文件的文件夹(使用tar的--排除标志)。然后删除归档文件夹以节省空间。
#!/bin/bash
in_dir=~/test_in_dir
out_dir=~/test_out_dir查找所有包含IMA文件的文件夹
find ${in_dir} -name '*.IMA' -printf '%h\n' | sort -u循环遍历目录并使其成为一个数组。
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循环遍历数组、$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 in_dir中的所有tar文件以节省空间
for y in "${array[@]}"; do
rm -r ${y}.tar.gz
donehttps://stackoverflow.com/questions/59622610
复制相似问题