我必须转换文件夹中的多个视频文件。我必须重命名它们中的每一个,但我需要脚本提示我为每个文件名编写一个自定义名称。这是我到目前为止所得到的:
首先,我需要删除我的脚本使用该命令执行的文件名空格:
for f in *' '*; do mv "$f" "`echo $f | sed -e 's/ /_/g'`"; done
我删除了文件的扩展名,因为转换不需要它。我使用这个命令:
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
如果我可以这么说的话,重命名文件的方式真的很乏味......