2010-10-22 71 views
0

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

这是我的命令至今:

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. 移动文件夹中的另一个目录/fs/fi位于s11003232sz.net
  4. 用户请求在服务器上的文件夹应解压文件夹并将其移回原始目录/fss/fin
+0

你需要文件夹中的所有文件还是只需要文件夹本身? – seejay 2010-10-22 08:24:45

+0

请编辑问题以澄清要求。 – 2010-10-22 14:00:37

+0

你仍然需要更清楚地思考和解释你所追求的。特别是,步骤1..3和步骤4之间是否有任意的时间差?单个脚本不是处理这种时间差的好方法。 tar文件应放在哪里?目前尚不清楚你在第3步中的含义 - “服务器xxxx”中的“评论”是什么意思?你是否想要将数据移动到另一台机器上?为什么4不是“将文件夹移回原始位置”?为什么要在tar文件中创建副本时移动目录?为什么不只是删除文件夹?什么是真正的目标?家庭作业? – 2010-10-22 14:09:08

回答

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 /片)在名称中包含空格,则有更多的工作要做一次 - 我假设没有目录要备份的开始用“”:

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

这从通过‘*’所生成的列表杂草出非目录,并用NUL‘\ 0’(零个字节)将它们写入标记每个名称的末尾(而不是换行符)。输出被写入'xargs',它被配置为期望NUL终止的名字,并且它用正确的目录名运行'tar'。和以前一样,这个合奏的输出被发送到第二个焦油。

如果您有目录名称以'。'开始。收集,然后在'*'后添加'.[a-z]*'或其他合适的图案;你使用什么不列出是至关重要的。“要么 '..'。如果目录中的名称以短划线开头,则需要使用'./*'和'./.[a-z]*'。

如果您还有更多不正当的要求,请在对问题的修正中清楚地阐明它们。

+0

Unix脚本首先应该找到所有的文件夹然后tar它,那么我们怎么写一个unix shell脚本 – Shenna 2010-10-22 08:35:20

+0

这是一个shell脚本(双线程);它不需要找到文件夹,因为'tar'很适合你。如果你想要的不仅仅是'essbase'目录,那么我们还有更多的工作要做。 – 2010-10-22 08:37:05

+0

我们如何可以编写一个脚本为 – Shenna 2010-10-22 08:42:14

-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 
+0

A面-note:不适用于名称中带有空格的目录。 – kenorb 2015-09-11 22:12:28

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

这个问题和你的回放给了我们一个想法,当它使用增量方法时,压缩cpanel日常文件夹看看http://subversion.assembla.com/svn/lhth/trunk/bash/compress_folder_folders.sh所以谢谢你的重放和寻求帮助 – 2012-01-16 22:54:42

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处理,如果成功 - 将它们移动到不同的文件夹中。

相关问题