如果满足特定条件则递归移动文件

如果满足特定条件则递归移动文件

我有以下目录树:

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

相关内容