在linux环境中的给定目录中,我需要选择所有文件在特定日期(假设 7 天)以及所有日期后修改目录(仅在根目录中,因此非递归)在同一日期之后创建。
之后,我必须处理除最后一个给定规则之外的 3 个目录。对于这些,该过程必须在每个过程中递归。在这些目录之一中,有一个文件无论如何都要排除。
最后,我必须将与这些模式匹配的所有对象添加到单个 .tar 存档中。当然,每个文件/目录都必须在 .tar 文件中保留完整的相对路径(从基本目录开始)。
所以我们假设我们有:
myHome
|-- normalDir1 // older than 7 days
| |-- blah.txt
| |-- to_be_excluded_nmw.txt // should never be included anyways
| `-- poems.txt
|-- normalDir2 // created yesterday
| |-- blah2.txt /*
| |-- whatever2.txt * Since it's a normal directory,
| |-- whatever3.txt * I want to exclude these files from .tar
| `-- poems2.txt */
|-- exceptionDirectory1 // older than 7 days
| |-- actions // older than 7 days
| | `-- power.sh // older than 7 days
| `-- events // older than 7 days
| |-- deploy.php // older than 7 days
| `-- set.php // older than 7 days
|-- exceptionDirectory2 // older than 7 days
| |-- actions2
| | `-- power2.sh // created yesterday
| `-- events2 // older than 7 days
| |-- deploy2.php // created yesterday
| `-- set2.php // older than 7 days
|-- file_to_be_updated.php // created yesterday
`-- file_NOT_to_be_updated.php // older than 7 days
生成的 .tar 应包含:
./normalDir2/
./exceptionDirectory2/actions2/power2.sh
./exceptionDirectory2/events2/deploy2.php
./file_to_be_updated.php
我创建了这个脚本:
#!/bin/bash
TODAY=`date --rfc-3339=date`
FILENAME=$TODAY-package.tar
find ./require ! -name db_connection.php ! -path ./require -mtime -7 -print | xargs tar cvf `date --rfc-3339=date`-package.tar
find ./img ! -path ./img -mtime -7 -print | xargs tar uvf `date --rfc-3339=date`-package.tar
find ./plugin ! -path ./plugin -mtime -7 -print | xargs tar uvf `date --rfc-3339=date`-package.tar
find . -maxdepth 1 ! -name $TODAY-package.tar.gz ! -path . -mtime -7 -print | xargs tar uvf `date --rfc-3339=date`-package.tar
但它似乎无法正常工作,因为它几乎立即因以下错误而退出:
tar: ./img: Impossibile open: Is a directory
请注意,“require”、“img”和“plugin”是要递归处理的三个特殊目录。剧本有什么问题吗?谢谢您的帮助。
答案1
导致错误的原因是 .txt 下的文件名中有空格或其他特殊字符./img
。
不要使用-print
的选项find
,而是使用`xargs' 的-print0
相应选项:-0
find ./img ! -path ./img -mtime -7 -print0 | xargs -0 tar uvf `date --rfc-3339=date`-package.tar
答案2
- 而不是
find ./foo ! -path ./foo
你可以使用find -mindepth 1 ./foo
.这确保只有文件里面打印指定的路径。 如果您有 GNU,
tar
则可以使用--exclude=PATTERN
.这样你应该能够写出这样的东西:today="$(date --rfc-3339="date")" last_week="$(date --rfc-3339="date" --date="-7 days")" tar --no-recursion --exclude=db_connection.php --after-date="$last_week" cvf "${today}-package.tar" . tar --after-date="$last_week" uvf "${today}-package.tar" ./require ./img ./plugin
答案3
我即时编写,尝试一下它是否能发挥作用
tar cvf --no-recursion --after-date $yourdate $TarFile * */*
tar uvrf --after-date $yourdate $TarFile ./require ./plugin ./img