我有以下目录树:
records/13/2014.12.16/00/05.mpg
records/13/2014.12.16/00/15.mpg
records/13/2014.12.16/01/05.mpg
records/13/2014.12.16/02/15.mpg
records/15/2014.12.14/05/25.mpg
etc.
我需要将*5.mpg
名称中包含的每个文件重命名为*0.mpg
.例如:
mv records/13/2014.12.16/00/05.mpg records/13/2014.12.16/00/00.mpg
mv records/13/2014.12.16/00/15.mpg records/13/2014.12.16/00/10.mpg
mv records/15/2014.12.14/05/25.mpg records/15/2014.12.14/05/20.mpg
etc.
我知道我必须编写一个 bash 脚本才能做到这一点。不幸的是我不擅长,这就是为什么我向你寻求帮助。我想它必须进入每个目录(递归部分)并移动该目录中的每个文件(如果其名称包含*5.mpg
.
答案1
只需循环遍历所有*.5mpg
文件并使用参数扩展的帮助来更改文件名:
for file in *5.mpg; do mv -- "$file" "${file%5.mpg}"0.mpg; done
要对不同的目录执行此操作,请设置 globstar 选项(shopt -s globstar
在 bash 中),并另外使用命令获取路径组件dirname
或再次使用参数扩展。
答案2
另一个解决方案:
find records -type f -iname '*.mpg' | xargs rename 5.mpg 0.mpg
由于您要重命名的所有文件都以 *5.mpg 结尾,因此此find
+rename
组合将非常适合您。
答案3
实际上我尝试过写自己的剧本。这似乎有效:
#!/bin/bash
find . -type f -iname "*5.mpg" -print0 | while IFS= read -r -d $'\0' line; do
new=${line//5.mpg}
zero="0.mpg"
buffer=$new$zero
new=$buffer
mv $line $new
echo "Moving $line"
done