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

Posted

技术标签:

【中文标题】Unix 脚本查找目录中的所有文件夹,然后 tar 并移动它们【英文标题】:Unix script to find all folders in the directory, then tar and move them 【发布时间】:2010-10-22 08:23:20 【问题描述】:

基本上我需要运行一个 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 目录中的所有文件夹,然后将它们 tar 到另一个目录 /fs/fi

说明 2:

我想明确要求。 Shell 脚本应包含:

    找到/fss/fin目录下的所有文件夹 压缩文件夹 将文件夹移动到位于服务器s11003232sz.net 上的另一个目录/fs/fi 应用户请求,它应该解压缩文件夹并将它们移回原始目录/fss/fin

【问题讨论】:

您需要文件夹中的所有文件还是只需要文件夹本身? 请编辑问题以阐明要求。 你仍然需要更清楚地思考和解释你所追求的。特别是,步骤 1..3 和步骤 4 之间是否存在任意时间间隔?单个脚本不是处理此类时间间隔的好方法。 tar 文件应该放在哪里?目前尚不清楚您在第 3 步中的意思 - 'which in server xxxx' 评论是什么意思?您是否正在寻求将数据移动到另一台机器?为什么 4 不“将文件夹移回原始位置”?为什么要在 tar 文件中制作副本时移动目录?为什么不直接删除文件夹?真正的目标是什么?作业? 【参考方案1】:

这是我正在使用的一个示例,它可能会引导您朝着正确的方向前进

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

【讨论】:

问题和你的回放给了我们一个想法,当它使用增量方法时压缩 cpanel 每日文件夹看看subversion.assembla.com/svn/lhth/trunk/bash/… 所以感谢你的回放和帮助【参考方案2】:

由于tar 会自动创建目录,因此您真的不需要做太多事情。假设 GNU 焦油:

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

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


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

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

这会将目录更改为源目录;它以最大深度 1 运行 'find' 以查找目录并使用 '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”。像以前一样,这个 ensemble 的输出被发送到第二个 tar。

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

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

【讨论】:

Unix 脚本应该先找到所有文件夹,然后 tar ,所以我们如何编写一个 unix shell 脚本 那是一个shell脚本(一个两行);它不需要找到文件夹,因为“tar”很适合为您做这件事。如果您想要的不仅仅是“essbase”目录,那么我们还有更多工作要做。 我们如何为此编写脚本 我得到了编码 好的我想明确要求 Shell 脚本应该包含 1) 找到目录 /fss/fin 中的所有文件夹 2) 压缩文件夹 3) 移动文件夹在服务器 s11003232sz.net 中的另一个目录 /fs/fi 中 4)当用户请求解压文件夹并将其移回原始目录 /fss/fin【参考方案3】:
find /fss/fin -d 1 -type d -name "*" -print

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

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

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

【讨论】:

【参考方案4】:

这是一个 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

找到所有文件夹,将它们分开打包,如果成功 - 将它们移动到不同的文件夹中。

【讨论】:

【参考方案5】:

应该这样做:

#!/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

【讨论】:

附注:不适用于名称中包含空格的目录。

以上是关于Unix 脚本查找目录中的所有文件夹,然后 tar 并移动它们的主要内容,如果未能解决你的问题,请参考以下文章

如何查找各个子文件夹中的所有tar文件,然后将它们提取到找到的相同文件夹中?

Unix shell 脚本 - 使用 /bin/sh shell 查找以前的日期

在多个目录中的文件中查找和替换包含引号的字符串 - unix aix

Linux脚本练习之script002-自动将用户主目录下所有小于 5KB 的普通文件打包成 `xx.tar.gz`。

如何编写一个读取目录中所有文件名并在文件名中找到特定字符串的shell脚本?

用于在远程系统上归档文件的 Unix shell 脚本