tar压缩脚本执行后生成同名文件的原因及解决方法
问题原因
- 脚本里的
find | xargs mv命令末尾加了&,让文件移动操作后台异步执行,后续的tar、rm命令会立刻运行,不会等后台的移动任务完成。 - 当
rm -rf compressdir执行完毕后,后台的移动进程可能还在运行,此时compressdir目录已经被删除,mv命令发现目标目录不存在,就会把待移动的文件直接重命名为compressdir(也就是你看到的同名文件)。如果有多个文件在后台等待移动,最后完成移动的文件会覆盖之前的,最终留下一个名为compressdir的文件。
解决方法
去掉后台执行符号
&,让文件移动操作在前台完成后,再执行后续的压缩、删除步骤:
修改后的脚本片段:sudo find . -type f -name "*.txt" -print | xargs -I {} mv {} compressdir > /dev/null 2>&1更可靠的写法:用
find -exec替代xargs,避免文件名含特殊字符(如空格)导致的问题,同时无需依赖xargs:sudo find . -type f -name "*.txt" -exec mv {} compressdir \; > /dev/null 2>&1可选:增加目录有效性检查,进一步避免意外:
在移动文件后添加判断,确保目录存在且有内容再执行压缩:if [ -d "compressdir" ] && [ "$(ls -A compressdir)" ]; then tar -cvzf compresslog.tar.gz --remove-files compressdir mv compresslog.tar.gz compresslog-`date +"%d%m%Y"`.tar.gz fi rm -rf compressdir
内容的提问来源于stack exchange,提问作者tuanle
相关产品推荐
相关产品推荐

