脚本和变量的空白问题

ezg*_*ght 1 command-line bash scripts

我试图反对这个语法。我遇到了空格问题,我不知道是否有更好的方法来做到这一点。

vardir=/home/user
cd $vardir
for i in $(ls "$vardir") ; do
timestamp="$(stat -c %Y $i)"
echo "$i"
echo "$timestamp"

done
Run Code Online (Sandbox Code Playgroud)

无论我在哪里引用,结果都是相似的,我不确定我做错了什么:

stat: cannot stat ‘Temporary’: No such file or directory
Temporary

stat: cannot stat ‘Items’: No such file or directory
Items
Run Code Online (Sandbox Code Playgroud)

我的目标是我想从备份目录和touch当前目录中获取时间戳以恢复原始修改日期。

Dav*_*ter 6

正如其他人在我之前所说:不要解析ls!

为什么不简单:

stat --printf='%y\t%n\n' -- *
Run Code Online (Sandbox Code Playgroud)

如果你想对每个文件名和时间戳做一些事情,read输出stat如下:

stat --printf='%y\t%n\0' -- * | \
while IFS=$'\t' read -rd '' timestamp i; do
    echo "filename: ${i}, timestamp: ${timestamp}"
done
Run Code Online (Sandbox Code Playgroud)

无需stat为每个文件生成一个新进程,只要您为几百个文件生成几百个进程,您就会注意到这一点。

对于比简单的 globbing 更复杂的匹配,我建议find使用合适的-printf选项。

编辑:根据对此答案的评论,我发现 OP 实际上想将修改时间戳从一个目录的文件复制到另一个目录。这是我的建议:

for f in /source/dir/*; do
    touch -c -r "${f}" "/dest/dir/${f##*/}"
done
Run Code Online (Sandbox Code Playgroud)

这将所有条目/source/dir作为时间戳引用 ( -r) 用于相同文件名的条目,/dest/dir而不会创建尚不存在的新文件/dest/dir( -c)。