我想重命名目录中的所有文件。新名称不遵循任何模式,因此我无法使用rename
。有没有有效的方法可以做到这一点,这样我就不必mv foo.txt bar.txt
对每个文件都使用?
答案1
当考虑将其编写为脚本时,我检查了可能的名称是否已被使用,结果发现我猜“交互式移动”已经编写并可以使用。对于大多数系统,它应该在重命名实用程序包,其中包含各种非常有用的工具:
- qmv/qcp:快速移动/复制,将所有文件名写入可编辑的文本文件。
- 国际医学影像学会:交互式移动/复制,要求输入文件的新名称。
imv
在这种情况下, /的问题icp
是,它们只接受一个参数:
imv FILENAME
多个参数将导致错误。因此,您基本上必须将其包装在一个短for
循环中:
for file in *; do imv "$file"; done
.bashrc
这当然很难输入,所以我们应该将其包装成一个可以放在我们的文件中的现成函数。
# Mass Interactive Move
function mimv {
for file in "$*"; do
imv "$file"
done
}
幸运的是,imv
显示了当前正在处理的文件的名称,所以我们不需要任何 echo 语句,这样我们就知道发生了什么。
答案2
您可以使用此命令:
for i in *; do
read -p "$i -> " newname
if [[ ! -z "$newname" ]]; then
mv -v -- "$i" "$newname"
fi
done
它会提示您为for i in *
当前目录中的每个文件和每个目录 ( ) 输入新名称。新名称将被读入$newname
。如果您点击Enter而不输入新名称,则不会执行任何操作(-z $newname
检查,如果$newname
为空(是ero);!
是合乎逻辑的not
,否则mv
用于重命名文件。
如果你只想稍微改变文件名,那么更有效的方法是编辑它以旧文件名开头,正如@grawity 所建议的:
for i in *; do
read -p "$i -> " -e -i "$i" newname
if [[ ! -z "$newname" ]]; then
mv -v -- "$i" "$newname"
fi
done
我用包含空格和括号的文件名进行了测试,但请自行承担使用风险(并提前备份原始文件)。
答案3
/usr/bin/env bash 对于 $( echo * ) 中的文件; 做 echo -n 将 $files 重命名为哪个名字?; 读取新名称; mv“$files”“$new_name”; 完毕