向不以“]”结尾的文件递归添加一些内容

向不以“]”结尾的文件递归添加一些内容

我正在尝试以递归方式附加[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

我的版本是findxargsrename

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

下面的脚本应该可以完成这个任务。使用方法如下:

  1. 将其复制到空文件中
  2. 另存为rename.py
  3. 运行方式:

    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++ xargsrename

find . -type f -regex "^.*[^]]\..*$" -print0 | xargs rename -n "s/^(.*)(\..*)$/\$1 \[Full\]\$2/"
  • .in find:递归列出当前工作目录中的所有文件和文件夹
  • -type fin find:仅列出文件
  • -regex "[...]"[...]:仅列出文件名与正则表达式匹配的文件
  • ^.*[^]]\..*$]:匹配任何最后一个.字符前没有其他字符的字符串
  • -print0in find:打印文件名后跟一个NULL字符而不是换行符
  • xargs:将每个文件的路径传递给rename
  • -nin rename:打印更改但不应用它们
  • s/^(.*)(\..*)$/\$1 \[Full\]\$2/:在文件名的[Full]最后一个字符前附加一个字符串.

要应用更改,请-nrename命令中删除选项:

find . -type f -regex "^.*[^]]\..*$" -print0 | xargs rename "s/^(.*)(\..*)$/\$1 \[Full\]\$2/"

相关内容