这是我为练习而编写的脚本。它应该递归地在当前目录的子树中查找所有常规文件,并将最后修改日期更改为昨天日期。
#!/bin/bash
YESTERDAY=$(date -d yesterday)
RFILES=$(ls -lR | egrep '^-' | rev | cut -d" " -f1 | rev)
for i in $RFILES ; do
ABSPATH=$(readlink -f $i)
touch "$ABSPATH" -d "$YESTERDAY"
done
如果我在具有如下子树的目录中调用它:
a
|___ b
| |__ file1
| |__ file2
|
|__ file3
|__ file4
readlink
没有按预期工作。我的意思是它告诉我file1
并且file2
在目录a
中。因此,当我用来更改他们的最后修改日期时,它会在目录中touch
创建另外两个file1
,并在昨天的日期。file2
a
首先,命令
ls -lR | egrep '^-' | rev | cut -d" " -f1 | rev
只显示没有路径的文件名。如果您需要获取所有带有路径的文件,您可以使用find ./ -type f
并解析该输出。因此readlink -f $i
命令将不是必需的。其次,如果您需要更有效的解决方案,您只需要
find
带exec
参数的命令:readlink 程序用于读取符号链接的位置,如果您只有常规文件,则可能有更好的工具来完成这项工作。对于查找文件,我喜欢使用
find
命令。看来您可以使用 find 一步完成整个练习:find .
: 搜索当前目录.
,以及下面的所有内容-type f
: 只搜索常规文件-exec
: 告诉 find 为它找到的每个对象运行以下命令touch {} -d "$(date -d yesterday)" \;
:您要对每个文件执行的命令。"{}" 是输出的占位符find
和 \; 指定-exec
语句的结尾您的 RFILES 只是没有路径的文件名。
readlink
不是find
,它使用您给它的名称,并且其中没有路径,它们被假定在当前目录中。使用现代 bash:
但是你不需要
readlink
你可以直接使用的输出ls
。使用globstar
它很简单:在实践中你甚至不需要
ls
:否则与
find
:最后,日期规范
touch
比你想象的更灵活:将工作...