我正在尝试以递归方式附加[Full]
到所有子目录中不以 结尾的所有文件]
。
例子:
Untold Story.wav
应重命名为Untold Story [Full].wav
Untold Story [Instrumental].wav
应该不是更名为Untold Story [Instrumental] [Full].wav
谢谢!
答案1
这将添加[FULL]
到所有 .wav 的名称中,其名称不是结束于].wav
:
find . -type f ! -name '*].wav' -exec bash -c 'mv "$1" "${1%.wav} [FULL].wav"' none {} \;
怎么运行的
find . -type f ! -name '*].wav'
这将以递归方式查找当前目录下所有
.
名称不以 结尾的常规文件].wav
。-name '*].wav'
会查找名称以 结尾的文件].wav
。由于!
是否定,! -name '*].wav'
因此会查找名称以 结尾的所有文件不是结束于].wav
-exec bash -c 'mv "$1" "${1%.wav} [FULL].wav"' none {} \;
这将重命名找到的文件
find
。这会将文件的名称作为其第一个参数传递给 bash,.
$1
用于mv
重命名文件。
答案2
我的版本是find
,xargs
和rename
find . -type f -iname "*.wav" -print0 | xargs -0 -I {} rename -v 's/^(.*[^\]])(\..*)/$1 [Full]$2/' {}
开始很简单,
find …
您可以轻松更改开始(.
)文件夹和匹配的文件(*.wav
):在当前文件夹 (
.
) 中搜索所有-type f
扩展名为 ( )的文件.wav
(-iname "*.wav"
)rename
使用以下命令创建命令xargs
中
{}
的rename …
替换为find
结果
一些正则表达式并且它有效。
答案3
下面的脚本应该可以完成这个任务。使用方法如下:
- 将其复制到空文件中
- 另存为
rename.py
运行方式:
python3 /path/to/rename.py <directory_with_files>
剧本:
#!/usr/bin/env python3
import shutil
import os
import sys
for root, dirs, files in os.walk(sys.argv[1]):
for file in files:
check = file.rfind("."); name = file[:check]
print(name)
if all([not name.endswith("]"), check not in (-1, 0)]):
shutil.move(root+"/"+file, root+"/"+name+" [Full]"+file[check:])
它能做什么:
- 它将文件拆分为基本名称 + 扩展名(递归地拆分目录内的所有文件)
- 查看基本名称是否以“]”结尾
- 如果不是,它会将“ [Full]”添加到基本名称,将其与扩展名合并,然后移动(重命名)该文件。
- 不可见文件或没有扩展名的文件将被保留。
- 它适用于所有扩展
答案4
这只对文件名包含扩展名的文件有效:
使用find
++ xargs
:rename
find . -type f -regex "^.*[^]]\..*$" -print0 | xargs rename -n "s/^(.*)(\..*)$/\$1 \[Full\]\$2/"
.
infind
:递归列出当前工作目录中的所有文件和文件夹-type f
infind
:仅列出文件-regex "[...]"
[...]
:仅列出文件名与正则表达式匹配的文件^.*[^]]\..*$
]
:匹配任何最后一个.
字符前没有其他字符的字符串-print0
infind
:打印文件名后跟一个NULL
字符而不是换行符xargs
:将每个文件的路径传递给rename
-n
inrename
:打印更改但不应用它们s/^(.*)(\..*)$/\$1 \[Full\]\$2/
:在文件名的[Full]
最后一个字符前附加一个字符串.
要应用更改,请-n
从rename
命令中删除选项:
find . -type f -regex "^.*[^]]\..*$" -print0 | xargs rename "s/^(.*)(\..*)$/\$1 \[Full\]\$2/"