如何在 bash 中使用通配符更改文件名

how to change filenames using wildcards in bash

所以我的具体问题是我下载了一些 mp3 专辑,它们的标题中没有曲目编号,所以它们默认按字母顺序排序,这显然不理想。我希望能够使用终端命令快速重命名它们,我在其中使用通配符对绒毛进行分类。所以我从几个角度尝试了这个但没有成功,并希望得到一些指导。

一方面,我想尝试一下mv *someSongN* 01-{reference original name here}。我不清楚,在 mv 的第二个参数中,我如何引用原始文件名,但在前面加上 01-.

我尝试的另一个方法是创建一个临时 bash 变量,然后是 mv 命令。我通过创建一个没有任何扩展名的测试文件来测试这一点 -- touch test。我发现 echomv 对通配符的处理方式不同。因此,假设测试文件是目录中唯一以 te-- ... var=te*; echo $var returns testvar=te*; mv $var $var.txt returns te*.txt .那么我在这里使用什么策略。我也可以使用图形文件管理器来做到这一点,但我以前做过,发现它很烦人。

这里是一个使用find命令的例子

#!/bin/bash
if [[  = "" ]] ; then
  echo "Please run the command specifying the filename you are searching for..."
  exit
fi
for i in $(find . -type f -name "" | tr -d './') ; do
  echo ${i}
  mv ${i} 01-${i}
done

然后你会运行...

./scriptName "*someSongN*"

以批处理的方式进行。通过重命名脚本创建包含列 fromName toName 的映射文件,运行。

while read a b; do mv "$a" "$b"; done < filemap

创建文件映射、ls 和粘贴

ls -1 > files; paste files files > filemap; rm files

并手动编辑 filemap 文件以添加所需的前缀。

当您只想移动一个文件时,您可以创建(内联)函数,例如

$ mvd() { mv  ; }

并像

一样使用它
$ mvd test.mp3 01-

这会将文件 test.mp3 移动到 01-test.mp3


通过使用 find,您可以对多个文件执行此操作,但这将导致所有文件仅以一个前缀 (find . -type f -name ${pattern} -exec mvd {} ${prefix}) 开头。

另一种选择是使用 find . -type f -name ${pattern} 并使用 for 对其进行迭代。然后,你可以实现一个计数器:

$ i=0; for file in $(find . -type f -name ${pattern}); do mv $file $i-$file; let i+=1; done

问候 法比安