这是我写的一个练习剧本。它应该递归地查找当前目录的子树中的所有常规文件,并将上次修改日期更改为昨天日期。
#!/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更改他们上一次修改日期时,它会在a目录中创建另外两个file1和file2,日期为昨天。
发布于 2018-04-07 19:13:36
首先,命令ls -lR | egrep '^-' | rev | cut -d" " -f1 | rev只显示没有路径的文件名。如果需要获取带有路径的所有文件,则可以使用find ./ -type f并解析该输出。因此,不需要readlink -f $i命令。
其次,如果您需要更有效的解决方案,则只需要带有find参数的exec命令:
find . -type f -exec touch -d "$YESTERDAY" {} +
-type f find regular files发布于 2018-04-07 19:18:02
readlink程序用于读取符号链接的位置,如果您只有常规文件,则可能有更好的工作工具。为了查找文件,我喜欢使用find命令。似乎您可以使用find一步完成整个练习:
find . -type f -exec touch {} -d "$(date -d yesterday)" \;find .:搜索当前目录.,以及下面的所有内容-type f:只搜索常规文件-exec:告诉find为它找到的每个对象运行以下命令touch {} -d "$(date -d yesterday)" \;:要对每个文件执行的命令。"{}“是find输出的占位符,\;指定-exec语句的结尾发布于 2018-04-07 19:24:44
您的RFILES只是没有路径的文件名。readlink不是find,它使用您给它的名称,如果其中没有路径,则假设它们位于当前目录中。
现代的狂欢:
shopt -s globstar
RFILES=( ** )但是您不需要readlink,您可以直接使用ls的输出。对于globstar,它非常简单:
touch -d "$YESTERDAY" $(ls -d **)在实践中,您甚至不需要ls:
touch -d "$YESTERDAY" **否则,使用find:
find . -type f -exec touch -d "$YESTERDAY" {} +最后,touch的日期规范比您认为的更灵活:
touch -d yesterday **会有用的..。
https://unix.stackexchange.com/questions/436241
复制相似问题