tar和递归归档

时间:2014-09-03 11:51:31

标签: bash recursion find tar

我的代码应该以递归方式查找包含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)

1 个答案:

答案 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
  • tar可以使用-T -
  • 从stdin读取文件列表
  • 使用以null结尾的文件名(如果路径包含空格,则会有帮助)
  • --null指示tar使用此类空终止文件名
  • (cd ... &&)在子shell中运行,因此不需要cd返回