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
”选项在操作前更改目录。第一个tar
将essbase
目录中的所有内容写入标准输出(唯一的'-')。 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`。