Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/312.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 通过控制台操作从目录中的所有文件名中删除多个字符串_Python_String_Bash_File Rename - Fatal编程技术网

Python 通过控制台操作从目录中的所有文件名中删除多个字符串

Python 通过控制台操作从目录中的所有文件名中删除多个字符串,python,string,bash,file-rename,Python,String,Bash,File Rename,我想知道重命名目录中所有文件的最简单方法是什么 我有如下文件名: 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-0de

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

我有如下文件名:

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-)";

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

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

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

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

您可以使用bash patter替换和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

您可以使用bash patter替换和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

这将产生您想要的精确输出:

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

这将产生您想要的精确输出:

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

阐述@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以外的东西,你需要修改它。

阐述@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,你需要修改它。

是的,我在*中的文件中尝试了类似的方法;执行echo mv./$file./$echo$file |剪切-c17-;首先,对输出的原始字符串进行剪切。是的,我对*中的文件尝试了类似的操作;执行echo mv./$file./$echo$file |剪切-c17-;首先对输出的\u原始\u字符串进行剪切。这主意不错,但其中仍然没有计数器,如前一个答案。这主意不错,但其中仍然没有计数器,如前一个答案。刚刚尝试:回溯最近的调用上次:文件重命名\u names.py,第25行,在os.renamefilename中,新的\u文件名OSError:[Errno 2]没有这样的文件或目录刚刚试用过:回溯最近的调用last:file rename_names.py,第25行,在os.rename文件名中,新的文件名OSError:[Errno 2]没有这样的文件或目录这太棒了。谢谢!这太棒了。谢谢!