用于重命名文件的 For 循环,并提示每个文件名

用于重命名文件的 For 循环,并提示每个文件名

我必须转换文件夹中的多个视频文件。我必须重命名它们中的每一个,但我需要脚本提示我为每个文件名编写一个自定义名称。这是我到目前为止所得到的:

  1. 首先,我需要删除我的脚本使用该命令执行的文件名空格:

    for f in *' '*; do mv "$f" "`echo $f | sed -e 's/ /_/g'`"; done
    
  2. 我删除了文件的扩展名,因为转换不需要它。我使用这个命令:

    for x in *; do mv $x $(echo ${x%*.*}); done
    

之后,我需要一个 for 循环来重命名模式中的每个文件:

for i in * ; do mv $i $customname; done

问题是,在该阶段我需要脚本提示我在$customname每个文件的变量中添加什么名称。像这样的东西:

Rename file1 to:
.......

Rename file2 to:
.......

答案1

只需使用read从 STDIN 读取一行即可,如下所示。

for FILE in *; do
    echo "Rename '$FILE' to:"
    read NAME
    mv "$FILE" "$NAME"
done

此示例要求您在完成后按 Ctrl-C 中止,但您可以添加额外的if情况来中止,例如,如果未输入名称。

编辑:如果您希望所有目标文件具有与原始文件相同的文件扩展名(例如,如果调用了 a 文件,pogo.jpg您希望重命名的文件保持其.jpg结尾,而不必手动键入),您可以更改mv命令在上面的循环中:

mv "$FILE" "$NAME.${FILE##*.}"

${FILE##*.}上面字符串中的内容意味着:

  • ${FILE...}显示变量$FILE,但是...
  • ##从开头删除最长的匹配字符串(仅#匹配最短的一个)
  • *匹配零个或多个任意字符
  • .匹配字面句点

只有当整个表达式 ( *.) 匹配时才会将其删除,因此如果原始文件名中没有句点,您会得到一个奇怪的结果,新文件名将为NEWNAME.OLDNAME.

答案2

这是我在编写从电视节目中获取名称的脚本之前用于 USB-PVR 的内容...

#!/bin/bash

for f in "$@"
do
    echo Playing "$f"...
    mplayer "$f"
    echo That was "$f".
    read -p "New name? " newname

    if [ "$newname" != "" ]
    then
        mv -v -i "$f" PVR-"$newname".mkv
    fi

    sleep 1
done

如果我可以这么说的话,重命名文件的方式真的很乏味......

相关内容