我试图创建一个文本文件,其中包含给定目录中所有.pzfx
文件上次编辑的日期。最大的问题是所有的文件名都不是字符串,这会使在bash脚本中遍历它们变得复杂。
这是我目前为止的bash脚本:
#!/bin/bash
find . -type f|grep .pzfx$ | while read file; do for i in "$file" stat -c ‘%y’ "$file" >> exp.dates.txt; done
当我运行这个时,我得到以下错误:
./date.sh: line 3: syntax error near unexpected token `>>'
./date.sh: line 3: `find . -type f|grep .pzfx$ | while read file; do for i in "$file" stat -c ‘%y’ "$file" >> exp.dates.txt; done'
当重定向一个循环的输出时,>>
必须写在done
之后。此外,您的内部for
循环是不必要的,并且缺少do
和done
。
顺便说一下:使用-exec
时根本不需要循环,这对于带有空格的文件名也更安全。
find -type f -name *.pzfx -exec stat -c %y {} + > exp.dates.txt
我重构了你的代码,只是稍微调整你的find
,使事情更容易遵循,并能够得到它的工作。
重构代码:
#!/bin/bash
file_ext="${1:-.pzfx}"
while read -r ff ; do
echo "${ff}"
stat -c '%y' "${ff}" >> exp_dates.txt
done < <(find . -name "*${file_ext}" -type f)
如果使用GNUfind
(以及其他可能的;查看本地手册页),您根本不需要stat
:
find . -type f -name "*.pzfx" -printf "%tn" > exp.dates.txt
%t
格式为
文件的最后修改时间,以ctime(3)函数返回的格式。
对于更灵活的时间格式,使用%Tfmt
;fmt
的描述请参见手册。