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

时间:2016-04-04 20:07:19

标签: bash wildcard cp mv

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

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

我尝试的另一个方法是创建一个临时bash变量,然后是mv命令。我通过创建没有任何扩展名的测试文件(touch test)对此进行了测试。我发现echomv对通配符的处理方式不同。因此,假装测试文件是开始te-- ... var=te*; echo $var的目录中唯一返回test,但var=te*; mv $var $var.txt返回te*.txt。那么我在这里使用什么策略。我也可以使用图形文件管理器来完成这项任务,但我之前已经完成了这项工作,并且发现它非常无聊。

3 个答案:

答案 0 :(得分:0)

以下是使用find命令

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

然后你会跑......

./scriptName "*someSongN*"

答案 1 :(得分:0)

将其作为批处理进行。创建一个包含fromName toName列的映射文件,运行一个脚本进行重命名。

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

创建filemap,ls并粘贴

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

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

答案 2 :(得分:0)

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

$ mvd() { mv $1 $2$1; }

并像

一样使用它
$ 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

问候 费边