脚本和变量的空白问题
我试图击败我的头脑对抗这种语法。 我遇到空白问题,我无法看到是否有更好的方法来做到这一点。
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
当前的时间戳以恢复原始修改日期。
正如其他人在我之前说的: 不要解析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
过程,只要为几百个文件生成几百个进程就会注意到这一点。
对于比简单的globbing更复杂的匹配,我建议使用合适的-printf
选项find
。
编辑:根据对此答案的评论,我发现OP实际上想要将修改时间戳从一个目录的文件复制到另一个目录。 这是我的建议:
for f in /source/dir/*; do touch -c -r "${f}" "/dest/dir/${f##*/}" done
这将来自/source/dir
所有条目作为时间戳引用( -r
),用于/dest/dir
相同文件名的条目,而不创建/dest/dir
( -c
)中不存在的新文件。
不要解析ls
的输出,使用glob:
for i in * ; do
另外,引用可能包含空格的变量:
timestamp=$(stat -c %y "$i")