Unix脚本找到目录中的所有文件夹,然后tar并移动它们

时间:2010-10-22 08:23:20

标签: bash unix shell tar

基本上我需要运行一个Unix脚本来查找目录/ fss / fin中的所有文件夹(如果存在);然后我把它tar并移动到另一个目录/ fs / fi。

到目前为止,这是我的命令:

find /fss/fin -type d -name  "essbase" -print

这里我直接提到了文件夹名essbase。但相反,我想查找/fss/fin中的所有文件夹并全部使用它们。

如何找到/fss/fin目录中的所有文件夹& tar他们将他们移动到/fs/fi

澄清1:

  

是的我只需要使用Unix shell脚本找到目录/fss/fin目录中的所有文件夹,并将它们转到另一个目录/fs/fi

澄清2:

  

我想说清楚要求。 Shell脚本应包含:

     
      
  1. 查找目录/fss/fin
  2. 中的所有文件夹   
  3. 抓住文件夹
  4.   
  5. 将文件夹移动到位于服务器/fs/fi
  6. 上的另一个目录s11003232sz.net中   
  7. 根据用户请求,它应解压缩文件夹并将其移回原始目录/fss/fin
  8.   

5 个答案:

答案 0 :(得分:5)

这是我正在使用的一个示例,它可能会引导您找到正确的方向

BackUpDIR="/srv/backup/"
SrvDir="/srv/www/"
DateStamp=$(date +"%Y%m%d");

for Dir in $(find $SrvDir* -maxdepth 0 -type d ); 
do
    FolderName=$(basename $Dir);
    tar zcf "$BackUpDIR$DateStamp.$FolderName.tar.gz" -P $Dir
done

答案 1 :(得分:2)

由于tar自动执行目录,因此您实际上不需要做很多事情。假设GNU tar:

tar -C /fss/fin -cf - essbase |
tar -C /fs/fi   -xf -

-C”选项在操作前更改目录。第一个tar写入标准输出(单独的' - ')在essbase目录中找到的所有内容。 tar的输出通过管道传输到第二个tar,后者读取其标准输入(单独的' - ';有趣的不是它!)。


假设GNU找到,你也可以这样做:

(cd /fss/fin; tar -cf - $(find . -maxdepth 1 -type d | sed '/^\.$/d')) |
              tar -xf - -C /fs/fi

这会将目录更改为源目录;它运行'find',最大深度为1,以查找目录,并使用'sed'从列表中删除当前目录;第一个'tar'然后将输出写入第二个,这与之前相同(除了我切换参数的顺序以强调两个调用之间的并行性)。


如果您的顶级目录(实际位于/ fss / fin中的目录)在名称中有空格,那么还有更多工作要做 - 我假设没有要备份的目录以'开头。 “:

(cd /fss/fin; find * -maxdepth 0 -type d -print 0 | xargs -0 tar -cf -) |
 tar -xf - -C /fs/fi

这会从'*'生成的列表中清除非目录,并用NUL'\ 0'(零字节)写入它们,标记每个名称的结尾(而不是换行符)。输出被写入'xargs',它被配置为期望以NUL终止的名称,并且它使用正确的目录名运行'tar'。这个集合的输出像以前一样被发送到第二个tar。

如果您的目录名称以“。”开头收集,然后在'*'之后添加'.[a-z]*'或其他合适的模式;至关重要的是你使用的不列出'。'要么 '..'。如果您在目录中有以破折号开头的名称,则需要使用“./*”和“./.[a-z]*”。

如果您有更多不正当的要求,请在问题修正案中明确说明。

答案 2 :(得分:0)

find /fss/fin -d 1 -type d -name "*" -print

上面的命令为您提供/ fss / fin的第1级子目录列表。 然后你可以做任何事情。例如。将它们tar到您的输出目录,如下面的命令

tar -czf /fss/fi/outfile.tar.gz `find /fss/fin -d 1 -type d -name "*" -print`

原始目录结构将在解除后重新创建。

答案 3 :(得分:0)

以下是一个bash示例(使用您的路径更改/fss/fin/fs/fi):

dirs=($(find /fss/fin -type d))
for dir in "${dirs[@]}"; do
  tar zcf "$dir.tgz" "$dir" -P -C /fs/fi && mv -v "$dir" /fs/fi/
done

找到所有文件夹,单独tar它们,如果成功 - 将它们移动到不同的文件夹中。

答案 4 :(得分:-1)

这应该这样做:

#!/bin/sh

list=`find . -type d`

for i in $list
do
    if [ ! "$i" == "." ]; then
        tar -czf ${i}.tar.gz ${i}
    fi
done

mv *.tar.gz ~/tardir