我有脚本用于查找特定类型的文件并将它们压缩为单个 tar 存档并放入其他地方。但现在,需求发生了变化,我需要查找特定类型的文件,列出它并将它们每个压缩为 tar 存档并放入其他地方。目前我正在使用脚本
cd /to/top/of/dir/structure
tar -cf /path/to/tarfile.tar --files-from /dev/null # trick to create empty tar file
find . -type f ! -name '*.log' -print0 | xargs -0 tar -uvf /path/to/tarfile.tar
这是我取自这篇文章的内容:https://superuser.com/questions/436441/copy-every-file-with-a-certain-extension-recursive
因此,上述脚本会查找特定文件类型,然后将其存档为单个 tar 文件,然后将其放置到另一个位置。但我的问题是,我需要查找特定类型的文件,列出它们,将列出的每个文件打包成 tar 文件,然后将它们放入其他位置。
答案1
我要和...一起去
cd /to/top/of/dir/structure
find . -type f ! -iname '*.log' -exec gzip -c {} \> /path/to/gzips/\`basename {}\`.gz \;
...但我还没有测试过。
我真的很怀疑这是否是你真正需要的......
编辑
我可以尽量得到它...
find /path/to/top-level -iname "*.log" -printf "gzip -c %p > /path/to/gzips/%f.gz\n"
...输出您想要运行的命令。
我仍在努力执行这些命令,但还未将其-fprint
放入临时文件chmod +x
并执行那。
更不用说处理文件名中转义奇怪字符的任何问题。
编辑#2
好的,我无法将其缩减为一行(这是我的挑战,而不是你的),但我可以将其变成一个相当简单的脚本:
#!/bin/bash
function compress_file {
BASENAME=`/bin/basename "$1"`;
/bin/gzip -c "$1" > /path/to/gzips/$BASENAME.gz;
}
export -f compress_file;
/bin/find /path/to/top-level -iname "*.log" -exec /bin/bash -c 'compress_file "$0"' {} \;
export -fn compress_file;
答案2
如果没有管道(或 xargs),创建多个 tar 文件而不是一个,并且删除未压缩的文件,您可以这样做:
find /path/to/files -name "*.ext" -type f -exec tar -czf {}.tar.z {} \; -exec rm {} \;
答案3
查找文件并建立列表,告诉 tar 从列表中创建一个档案......
find /path/to/files -name "*.ext" | tar cJfTP /path/to/archive.txz -
旁注:您的示例并未压缩文件,而只是将其存档。
答案4
查找.-type f(-name".php“-o-名称”.js”-o-名称”.css“-o-名称”.crt“-o-名称”.htm*" -o -名称 ".txt“-o-名称”.$" -o -名称 ".xml”-o-名称“.ht" ) -print0 | tar -czpf $FILE --null -T -