linux - 使用 mv 在 bash 脚本中重命名文件

标签 linux bash mv

我从有故障的硬盘恢复了许多 MOV 文件,但是软件根据 block 位置命名这些文件:

263505816.mov等...

我写了一个使用 mediainfo 应用程序的小脚本,这样我就可以读取创建的日期和时间并相应地重命名文件:

for f in *.mov
do
    MODIFIED=$(mediainfo -f $f |grep -m 1 "Encoded date" |sort -u |awk -F "UTC " '{print $2}')
    DATECREATED=$(echo $MODIFIED |cut -d' ' -f 1)
    TIMECREATED=$(echo $MODIFIED |cut -d' ' -f 2 |tr -s ':' '-')

    mv $f "$DATECREATED $TIMECREATED.mov"

done

这很好用,但是当我通过在末尾添加 2 个词来修改 mv 语句时:

mv $f "$DATECREATED $TIMECREATED Holidays 2011.mov"

我得到以下信息:

mv: target â  Holidays 2011.movâ is not a directory

我知道我必须以某种方式标记空格,因为 mv 被误导说它是一个目录。其他文章没有提到将多个变量与 mv 结合使用,这就是我寻求指导的原因。

非常感谢,

最佳答案

我认为它第一次工作是因为 *.mov 只扩展到数字文件,就像你的例子中的那个,但是在你的脚本第一次执行之后,它重命名了文件,在形成 $DATECREATED $TIMECREATED.mov。基本上,第二次,mv 试图将 $DATECREATED$TIMECREATED.mov 移动到您的目标文件,因为它不是目录,它失败了。

您可以通过引用 $f 来解决这个问题。像这样尝试:

mv "$f" "$DATECREATED $TIMECREATED Holidays 2011.mov"

事实上,除非您确定变量不包含特殊字符,否则建议您始终使用引号引起来。

关于linux - 使用 mv 在 bash 脚本中重命名文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40207499/

相关文章:

mysql - 如何合并来自已发散的 mysql 模式的数据?

linux - 如何防止看门狗消息淹没 dmesg

Bash 执行解释

linux - 在 Shell Script Linux 中重命名文件

Linux 狂欢 : Move multiple different files into same directory

linux - 如何比较bash中的IP值?

c - 对小文件使用读取时堆栈溢出的解释和有问题的解决方法

linux - 替换所有脚本中字符串的解决方案

linux - 在文件中的变量后写入新行

linux - mv/重命名具有公共(public)部分但文件模式未知的文件