如何在 bash 中使用通配符更改文件名
how to change filenames using wildcards in bash
所以我的具体问题是我下载了一些 mp3 专辑,它们的标题中没有曲目编号,所以它们默认按字母顺序排序,这显然不理想。我希望能够使用终端命令快速重命名它们,我在其中使用通配符对绒毛进行分类。所以我从几个角度尝试了这个但没有成功,并希望得到一些指导。
一方面,我想尝试一下mv *someSongN* 01-{reference original name here}
。我不清楚,在 mv
的第二个参数中,我如何引用原始文件名,但在前面加上 01-
.
我尝试的另一个方法是创建一个临时 bash 变量,然后是 mv
命令。我通过创建一个没有任何扩展名的测试文件来测试这一点 -- touch test
。我发现 echo
和 mv
对通配符的处理方式不同。因此,假设测试文件是目录中唯一以 te-- ... var=te*; echo $var
returns test
但 var=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
问候
法比安
所以我的具体问题是我下载了一些 mp3 专辑,它们的标题中没有曲目编号,所以它们默认按字母顺序排序,这显然不理想。我希望能够使用终端命令快速重命名它们,我在其中使用通配符对绒毛进行分类。所以我从几个角度尝试了这个但没有成功,并希望得到一些指导。
一方面,我想尝试一下mv *someSongN* 01-{reference original name here}
。我不清楚,在 mv
的第二个参数中,我如何引用原始文件名,但在前面加上 01-
.
我尝试的另一个方法是创建一个临时 bash 变量,然后是 mv
命令。我通过创建一个没有任何扩展名的测试文件来测试这一点 -- touch test
。我发现 echo
和 mv
对通配符的处理方式不同。因此,假设测试文件是目录中唯一以 te-- ... var=te*; echo $var
returns test
但 var=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
问候 法比安