我的代码应该以递归方式查找包含doc / docx文件的文件夹,并仅存档其路径中的文件。当在tar中找到空时。焦油打破Cowardly拒绝创建一个空档案。我使用-maxdepth 1来避免它,但不确定这是否是正确的解决方案。另一个问题是oring无法按预期工作。如果 notest 存在,则 test 将被忽略。有什么建议? 也可以随意提出一些代码优化
for D in $(find . ! -newermt $date1 -ipath "*test*" -or -ipath "*notest*" -iregex ".*\.\(doc\|docx\)" -printf "%h\n" | sort -u)
do :
cd $D && tar --no-recursion --ignore-failed-read -czf archive.tar.zip $(find . -maxdepth 1 -iname "*.doc" -or -iname "*.docx" ) --remove-files
cd ~
done
实施例
Test
|____ test
| |___ subtest ___ 1.doc
| |___ 2.doc
| |___ 3.pdf
|____ notest ___ 1.doc
|___ 2.docx
预期
Test
|___ test
| |___ subtest ___ archive.tar.zip (contains docs)
| |___ 3.pdf
|___ notest ___ archive.tar.zip (contains docs)
答案 0 :(得分:1)
尝试下一个:
arch="archive.tar.gz"
while read -r -d $'\0' dir
do
(cd "$dir" && find . -maxdepth 1 -iregex '.*\.docx?' -print0 | tar --null -czf "$arch" -T - --remove-files)
#alternatively
#(cd "$dir" && shopt -s nocaseglob nullglob && tar --no-recursion -czf "$arch" *.doc *.docx --remove-files)
done < <(find . \( -ipath '*/test/*' -o -ipath '*/notest/*' \) -iregex '.*\.docx?' -printf '%h\0' | sort -zu)
一些评论:
-ipath
\( -ipath '*/test/*' -o -ipath '*/notest/*' \)
.*\.docx?
- 必须与整个文件名匹配,x?
表示零或一个x
-T -
--null
指示tar使用此类空终止文件名(cd ... &&)
在子shell中运行,因此不需要cd
返回