【问题标题】:Removing several strings from all filenames in a directory by a console operation通过控制台操作从目录中的所有文件名中删除几个字符串
【发布时间】:2019-09-04 01:53:58
【问题描述】:

我想知道重命名目录中所有文件的最简单方法是什么。

我的文件名看起来像这样:

output_original_2018_0729_112557_065.JPG_7c82d91a-6a2a-4f9f-a9ed-ccbc34afe7a9.JPG
output_original_2018_0729_112557_065.JPG_15f07152-76d0-4834-993b-2ca8f589310f.JPG
output_original_2018_0729_112631_070.JPG_cd08da59-0de7-4a94-b769-5450fb80e982.JPG

现在我想删除前导部分和结尾部分,如果文件名相同,则还使用计数器(第一、第二、第三)重命名文件本身。这导致了这样的结果:

2018_0729_112557_065_1.JPG
2018_0729_112557_065_2.JPG
2018_0729_112631_070.JPG

提前致谢

已编辑:我尝试使用正则表达式切断第一部分:

for file in *; do echo mv ./"$file" ./"$(echo "$file" | cut -c17-)";

【问题讨论】:

  • 是的,我对 *; 中的文件尝试了类似的操作;做 echo mv ./"$file" ./"$(echo "$file" | cut -c17-)";首先完成了“output_original_”字符串的剪切。

标签: python string bash file-rename


【解决方案1】:

阐述@Sergio 的想法:

# Make last also numbered
for file in *.JPG.~1~; do
  cp --backup=numbered $file ${file/.~1~}
  rm ${file/.~1~}
done

这会将2018_0729_112557_065.JPG 变成2018_0729_112557_065.JPG.~3~

现在,要更改编号方案:

for file in *.JPG.~*~; do
  new_name=$( echo "$file" | sed 's/\.JPG.~\([0-9]*\)~/_\1.JPG/'
  mv "$file" "$new_name"; done
done

当然,如果您有 .JPG 以外的内容,则需要对其进行修改。

【讨论】:

    【解决方案2】:

    这应该会产生您想要的确切输出:

    import os
    import re
    from collections import defaultdict
    
    
    folder = "/path/to/out_original/folder"
    regex = "output_original_(.+?.JPG)"
    
    p = defaultdict(list)
    
    for x in os.listdir(folder):
        try:
            p[re.findall(regex, x)[0]].append(x)
        except:
            pass
    
    for k, v in p.items():
        if len(v) == 1:
            os.rename(os.path.join(folder, v[0]), os.path.join(folder, k))
        else:
            count = 1
            for x in v:
                os.rename(
                    os.path.join(folder, x), 
                    os.path.join(folder, os.path.splitext(k)[0] + "_{}.JPG".format(count))
                )
                count += 1
    

    【讨论】:

    • 这太棒了。谢谢!
    【解决方案3】:

    您可以使用 bash 模式替换和 mv --backup=t 重命名重复的文件名:

    find . -name "output_original*" | while read -r file; do
        origin=$file
        file=${file/\.\/output_original_/}
        file=${file/JPG*/JPG}
        mv --backup=t $origin $file
    done
    

    样本输入:

    find . -name "output*"
    ./output_original_2018_0729_112557_065.JPG_15f07152-76d0-4834-993b-2ca8f589310f.JPG
    ./output_original_2018_0729_112557_065.JPG_7c82d91a-6a2a-4f9f-a9ed-ccbc34afe7a9.JPG
    ./output_original_2018_0729_112631_070.JPG_cd08da59-0de7-4a94-b769-5450fb80e982.JPG
    ./output_original_2018_0729_112557_065.JPG_15f07152-76d0-4834-993b-2ca8f589310x.JPG
    

    输出:

    $find . -name "2018*"
    ./2018_0729_112557_065.JPG
    ./2018_0729_112557_065.JPG.~1~
    ./2018_0729_112557_065.JPG.~2~
    ./2018_0729_112631_070.JPG
    

    【讨论】:

    • 好主意,但这仍然没有计数器,就像之前的答案一样。
    【解决方案4】:

    不完全是计数器的要求,但我没有时间修复它:

    import re
    import os
    
    filenames = [
        'output_original_2018_0729_112557_065.JPG_7c82d91a-6a2a-4f9f-a9ed-ccbc34afe7a9.JPG',
        'output_original_2018_0729_112557_065.JPG_15f07152-76d0-4834-993b-2ca8f589310f.JPG',
        'output_original_2018_0729_112631_070.JPG_cd08da59-0de7-4a94-b769-5450fb80e982.JPG',
    ]
    
    new_filenames = set()
    
    for filename in filenames:
        base_filename = new_filename = re.match(
            r'output_original_(.+?)\.JPG',
            filename,
        ).group(1)
        count = 1
        while new_filename in new_filenames:
            new_filename = "{base_filename}_{count}".format(**locals())
            count += 1
        new_filenames.add(new_filename)
        new_filename += ".JPG"
        print(filename, '->', new_filename)
        os.rename(filename, new_filename)
    

    输出:

    output_original_2018_0729_112557_065.JPG_7c82d91a-6a2a-4f9f-a9ed-ccbc34afe7a9.JPG -> 2018_0729_112557_065.JPG
    output_original_2018_0729_112557_065.JPG_15f07152-76d0-4834-993b-2ca8f589310f.JPG -> 2018_0729_112557_065_1.JPG
    output_original_2018_0729_112631_070.JPG_cd08da59-0de7-4a94-b769-5450fb80e982.JPG -> 2018_0729_112631_070.JPG
    

    【讨论】:

    • 刚刚尝试过:Traceback(最近一次调用最后一次):文件“rename_names.py”,第 25 行,在 os.rename(filename, new_filename) OSError: [Errno 2] No such文件或目录
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-06-25
    • 2012-11-05
    • 1970-01-01
    相关资源
    最近更新 更多