如何在linux上重命名目录中同一文件夹中具有不同/随机扩展名的所有文件



假设我在一个文件夹中有28k个文件,具有不同的随机文件扩展名。。。。参见示例:

br.AQ5702419254531904.GD14700006
br.CT7465737800862080.MV94400009
etc
etc
br.RH5816804080109504.BE59800003
etc
ect
etc

28k后。。。

我该如何将它们全部更改为

br.AQ5702419254531904.GD14700006.txt or *.json
br.CT7465737800862080.MV94400009.txt or *.json
br.RH5816804080109504.BE59800003.txt or *.json

您可以使用这样的脚本:

while read -r path; do
mv -v "${path}" "${path}.txt"
done < <(find . -type f -not '(' -name '*.txt' -or -name '*.json' ')' )

这个调用find(也处理目录中的文件(,忽略txt/sjon,并用*.txt.重命名文件

你也可以直接在命令行上这样做:

find . -type f -not '(' -name '*.txt' -or -name '*.json' ')' | while read -r path; do mv -v "${path}" "${path}.txt"; done

但是,仍然会创建一个子流程。

您还可以使用rename命令(可以接受regex(:

rename 's/(br[.][A-Z0-9]{18}[.][A-Z0-9]{10})/1.txt/g' *

如果您想将regex分解为多个集合以使其更具动态性,可以执行以下操作:
rename 's/(br[.])([A-Z0-9]{18}[.])([A-Z0-9]{10})/123.txt/g' *

这是一个人为的例子,但如果您需要将br.AQ5702419254531904.GD14700006转换为br.GD14700006.AQ5702419254531904.txt之类的操作,您可以执行以下操作:

rename 's/(br[.])([A-Z0-9]{18}[.])([A-Z0-9]{10})/132.txt/g' *

你会注意到,我翻转了记忆中的模式,所以是132做出了改变。它自己的一组括号中包含的所有内容都构成了记忆模式的一组。

您只需要将'em放在一个循环中,就可以使用'for':

#!/bin/bash
DIR="<your_directory_path>"
cd $DIR
for FILE in `ls $DIR`
do
mv $FILE $FILE.txt
done

最新更新