我目前处于这样一种情况,我需要重命名不同文件夹内的一堆文件,并使用相同的扩展名(SRT)。
目前,我的目录“setup”是这样的:
This is a folder (2000)
- This.is.a.folder.2000
- This.is.a.folder.2000.wmv
- This.is.a.folder.2000.txt
- This.is.a.folder.2000.srt
This is also a folder (2001)
- This.is.also.a.folder.2001
- This.is.also.a.folder.2001.wmv
- This.is.also.a.folder.2001.txt
- This.is.also.a.folder.2001.srt
我需要将 SRT 文件重命名为如下形式:
This is a folder (2000)
- This.is.a.folder.2000
- This.is.a.folder.2000.wmv
- This.is.a.folder.2000.txt
- This.is.a.folder.2000.en.srt
This is also a folder (2001)
- This.is.also.a.folder.2001
- This.is.also.a.folder.2001.wmv
- This.is.also.a.folder.2001.txt
- This.is.also.a.folder.2001.en.srt
有什么办法吗?我正在运行 Ubuntu 服务器,只有一个终端可用。
如果有人能帮助我,我将非常感激:)。
答案1
您可以使用 的bash
选项globstar
,并启用shopt -s globstar
:
**
如果设置,路径名扩展上下文中使用的模式将匹配所有文件和零个或多个目录和子目录。
printf '%s\0' **/*.srt | xargs -0 rename 's/srt$/en.$&/'
这将构建一个零分隔列表,其中包含*.srt
当前目录中或目录下的所有匹配文件,并将其通过管道传输到该列表,并根据需要多次xargs
运行。表达式将最后的“srt”替换为“en。”,后跟匹配的字符串 ( )。rename
rename
$&
示例运行
$ tree
.
├── 1
│ └── test.srt
├── 2
│ └── 3
│ └── test.srt
├── srt.srt
└── test.srt
$ shopt -s globstar
$ printf '%s\0' **/*.srt | xargs -0 rename 's/srt$/en.$&/'
$ tree
.
├── 1
│ └── test.en.srt
├── 2
│ └── 3
│ └── test.en.srt
├── srt.en.srt
└── test.en.srt
答案2
如果您的系统没有rename
(或者有错误的rename
1),那么您可以使用 shell 参数扩展轻松执行这种特殊类型的替换${f%.srt}
以删除尾随.srt
的$f
:
find path/to/dir -name '*.srt' -execdir sh -c '
for f; do echo mv "$f" "${f%.srt}.en.srt"; done
' sh {} +
echo
一旦您确认它做了正确的事情,就将其删除。
答案3
查看重复的问题总体方法。显然,您需要根据具体要求进行调整:
- 对于的参数
rename
,您可以提供's/\.srt/\.en\.srt/'
,它将.srt
通过进行搜索和更改.en.srt
。 - 为了更安全(可能也更快)地工作,请将 find 限制为仅定位
.srt
. 文件。为此,请将-name '*.srt'
选项添加到 find 命令中。 - 首先通过向重命名命令添加选项进行测试运行
-n
。这将展示如何重命名而无需实际执行。如果一切正常,请重新运行不带选项的命令-n
。
根据提出类似问题的帖子,该命令看起来像
find /path/to/parrent-dir -type f -name '*.srt' -exec rename -n 's/\.srt/.en.srt/' {} +