我正在努力理解这种语法。我遇到了空格问题,我不知道是否有更好的方法可以解决此问题。
vardir=/home/user
cd $vardir
for i in $(ls "$vardir") ; do
timestamp="$(stat -c %Y $i)"
echo "$i"
echo "$timestamp"
done
无论我引用哪里,结果都是相似的,我不确定我做错了什么:
stat: cannot stat ‘Temporary’: No such file or directory
Temporary
stat: cannot stat ‘Items’: No such file or directory
Items
我的目标是从备份目录和当前目录中获取时间戳touch
以恢复原始修改日期。
答案1
正如其他人在我之前所说的:不要解析 的输出ls
!
为什么不简单地:
stat --printf='%y\t%n\n' -- *
如果要对每个文件名和时间戳执行某些操作,则read
输出stat
如下:
stat --printf='%y\t%n\0' -- * | \
while IFS=$'\t' read -rd '' timestamp i; do
echo "filename: ${i}, timestamp: ${timestamp}"
done
不需要stat
为每个文件生成一个新进程,当您为几百个文件生成几百个进程时您就会注意到这一点。
对于比简单匹配更复杂的匹配,我建议find
使用合适的-printf
选项。
编辑:根据对此答案的评论,我发现 OP 实际上想要将修改时间戳从一个目录的文件复制到另一个目录。这是我的建议:
for f in /source/dir/*; do
touch -c -r "${f}" "/dest/dir/${f##*/}"
done
这将把来自的所有条目/source/dir
作为时间戳引用(-r
)中相同文件名的条目,/dest/dir
而不会创建中尚不存在的新文件/dest/dir
(-c
)。
答案2
不要解析的输出ls
,使用 glob:
for i in * ; do
另外,引用可能包含空格的变量:
timestamp=$(stat -c %y "$i")