我正在尝试编写一个脚本,将最后访问时间添加到基本名称的末尾。以下是脚本:
for f in *.doc; do
DIR=$(pwd)
FILENAME="$f"
FILETYPE=${FILENAME##*.}
BASENAME=${FILENAME%.*}
LASTACCESS=$(stat --printf '%x' "$f" | sed 's/.........................$//' | sed 's/-//g')
#echo "FILENAME : ""$FILENAME"
#echo "FILETYPE : ""$FILETYPE"
#echo "BASENAME : ""$BASENAME"
echo "LASTACCESS : ""$LASTACCESS"
echo "$DIR"
echo mv "'""$DIR""/""$BASENAME"."$FILETYPE""'" "'""$BASENAME"-"$LASTACCESS"."$FILETYPE""'" > output
mv -- "'""$DIR""/""$BASENAME"."$FILETYPE""'" "'""$BASENAME"-"$LASTACCESS"."$FILETYPE""'"
done
当我从输出文件复制并粘贴时,它可以工作,但是当 mv 在脚本中运行时,它会在源文件上报告“无法统计”。
我尝试将 pwd 添加到代码中以包含完整路径名,结果相同。文件名和路径中有空格。
有谁知道我做错了什么?
答案1
当我从输出文件复制并粘贴时,它可以工作,但是当 mv 在脚本中运行时,它会在源文件上报告“无法统计”。
输出文件中的内容与脚本中运行的内容不同,并且你正在添加太多了脚本中的引述。
在运行命令之前,shell 会删除一层引用——最外层的引用用于处理空格等内容。
因此,当您使用两次引用"'$dir'"
(例如“echo”)时,它会接收'the_dir'
并输出一次引用的命令,因此您从 output.txt 文件粘贴的内容现在只有单引号。(当您将其粘贴回 Bash 时,shell 再次删除一层,并且“mv”命令接收不带引号的文件名,这是所需的结果。)
但是当你给"'$dir'"
“mv”时,它也会接收'the_dir'
输入...这意味着'
变成文件名的一部分。当然,mv 将无法找到该文件,因为您的实际文件名称中实际上没有单引号。
换句话说,你需要使用 'echo' 来生产命令与命令本身的需要不同。因此,请消除mv
调用中的混乱,只需"$dir/$basename"
使用一层引用即可。
(如果您也这样做也没问题"$dir"/"$basename"
;在 shell 扩展之后也会产生相同的字符串。)