在一个目录中有多个以fgh开头的文件,例如:

fghfilea
fghfileb
fghfilec

我想将它们全部重命名为以前缀jkl开头。是否有一个单独的命令来执行该操作,而不是逐个重命名每个文件?


当前回答

使用重命名:

$ renamer --find /^fgh/ --replace jkl * --dry-run

一旦您对输出看起来正确感到满意,就删除——dry-run标志。

其他回答

这是如何使用sed和mv一起执行重命名:

for f in fgh*; do mv "$f" $(echo "$f" | sed 's/^fgh/jkl/g'); done

根据下面的评论,如果文件名中有空格,则可能需要在返回文件名的子函数周围加上引号,以便将文件移动到:

for f in fgh*; do mv "$f" "$(echo $f | sed 's/^fgh/jkl/g')"; done

在Solaris上,您可以尝试:

for file in `find ./ -name "*TextForRename*"`; do 
    mv -f "$file" "${file/TextForRename/NewText}"
done

使用重命名:

$ renamer --find /^fgh/ --replace jkl * --dry-run

一旦您对输出看起来正确感到满意,就删除——dry-run标志。

我编写了这个脚本来搜索所有.mkv文件,递归地将找到的文件重命名为.avi。您可以根据自己的需要定制它。我还添加了一些其他的东西,比如从文件路径中获取文件目录,扩展名,文件名,以防你将来需要引用一些东西。

find . -type f -name "*.mkv" | while read fp; do 
fd=$(dirname "${fp}");
fn=$(basename "${fp}");
ext="${fn##*.}";
f="${fn%.*}";
new_fp="${fd}/${f}.avi"
mv -v "$fp" "$new_fp" 
done;

使用StringSolver工具(windows & Linux bash),通过示例处理:

filter fghfilea ok fghreport ok notfghfile notok; mv --all --filter fghfilea jklfilea

它首先根据示例计算一个过滤器,其中输入是文件名和输出(ok和notok,任意字符串)。如果filter有选项——auto或者在这个命令之后单独被调用,它会创建一个文件夹ok和一个文件夹notok,并分别将文件推送到它们。

然后使用过滤器,mv命令是一个半自动的移动,使用修饰符——auto变成自动的。使用前面的过滤器——filter,它找到了从fghfilea到jklfilea的映射,然后将其应用于所有过滤过的文件。


其他单行解决方案

做同样事情的其他等效方法(每一行都是等效的),所以你可以选择你最喜欢的方法。

filter fghfilea ok fghreport ok notfghfile notok; mv --filter fghfilea jklfilea; mv
filter fghfilea ok fghreport ok notfghfile notok; auto --all --filter fghfilea "mv fghfilea jklfilea"
# Even better, automatically infers the file name
filter fghfilea ok fghreport ok notfghfile notok; auto --all --filter "mv fghfilea jklfilea"

多步骤的解决方案

要仔细查看命令是否执行良好,您可以键入以下命令:

filter fghfilea ok
filter fghfileb ok
filter fghfileb notok

当你确信过滤效果不错时,执行第一步:

mv fghfilea jklfilea

如果你想测试,并使用前面的筛选器,输入:

mv --test --filter

如果转换不是你想要的(例如,即使用mv——解释你看到的东西是错误的),你可以输入mv——clear重新启动移动文件,或添加更多的例子mv input1 input2,其中input1和input2是其他例子

当你有信心的时候,就打字

mv --filter

瞧!所有重命名都是使用筛选器完成的。

免责声明:我是这篇论文的合著者。可能很快还会有bash生成功能。