linux - 如何查找子目录中匹配模式并替换模式的所有文件

标签 linux bash

我正在尝试将我的一些视频文件移动到新的子目录中,同时也在我的 Unraid 系统上重命名它们。这些文件都遵循类似的命名约定:

featurette name-featurette.mkv

我想将这些文件从当前目录移动到子目录并重命名它们,如下所示:

featurettes/featurette name.mkv 

我可以使用 find 和 execdir 创建目录并重新定位文件:

find . -type f -name *-featurette.mkv -maxdepth 2 -execdir mkdir ./featurettes/ \;
find . -type f -name *-featurette.mkv -maxdepth 2 -execdir mv {} ./featurettes/ \;

我正在努力解决重命名问题。我已经尝试过重命名命令,但无法让它在 featurettes 目录中工作,更不用说在上面的两个目录中,这是我想执行该命令的地方。我已在 featurettes 目录中尝试了以下命令:

rename \-featurette.mkv .mkv *

但是我收到错误:

invalid option -- 'f'

我认为通过转义破折号可以避免这个问题,但它似乎不起作用。任何有关如何从与其匹配的子目录中的所有文件中删除此模式的建议将非常感激。

最佳答案

man rename 中您可以看到此命令获取选项和 3 个位置参数:

SYNOPSIS rename [options] expression replacement file...

因此,在您的情况下,第一个参数被解释为选项。您可以使用以下语法:

rename -- '-featurette' '' *-featurette.mkv

重命名文件。 --表示任何选项都结束了,接下来的只是位置参数。


总共,用一个 mv 进程复制文件并重命名它们:

mkdir -p target/dir
find . -maxdepth 2 -type f -name "*-featurette.mkv" -exec mv -t target/dir {} +
cd target/dir && rename -- '-featurette' '' *-featurette.mkv

如果您想重命名位于不同子目录中的多个文件,可以使用以下语法:

find . -name "*-featurette.mkv" -print0 | xargs -r0 rename -- '-featurette' ''  

关于linux - 如何查找子目录中匹配模式并替换模式的所有文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64280121/

相关文章:

c# - 如何在后台以单声道运行exe

c - 在队列上执行 tr 命令?

linux - 使用 bash 脚本将键码发送到 Xorg + wine

linux - bash 脚本 Heredoc + FTP 错误

bash - 如何防止通过 su -c 调用的 bash 脚本在 SIGINT 后挂起

linux - 如何应对3.2亿个272字节的UDP数据包?

linux - 通过 ssh 编写 sudo 脚本

linux - Bash:将对象添加到 json 文件

linux - 用于查找文件的 Bash 脚本

bash - 使用 Unix 查找计数和删除旧文件