脚本 eports 中的 mv“无法统计”

脚本 eports 中的 mv“无法统计”

我正在尝试编写一个脚本,将最后访问时间添加到基本名称的末尾。以下是脚本:

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 扩展之后也会产生相同的字符串。)

相关内容