在文件中查找单词的第二个实例并重命名文件

Ian*_*anG 3 command-line scripts batch-rename

I 系统生成的具有通用文件名的文件。我想要一个可以运行的脚本,它会扫描这些文件中 ProcID 一词的第二个实例(在 ProcID 一词之后是一个数字),然后使用 ProcID 编号重命名该文件。目前我有以下几点:

FILEPATH; awk -F '[:)]' '/ProcID./{printf "mv %s %s.txt\n", FILENAME, $2 | "/bin/sh"; nextfile}' O*.TXT
Run Code Online (Sandbox Code Playgroud)

例如,脚本扫描文件并找到第二个实例,(ProcID:0000014778)然后使用此过程 ID 号重命名文件。

上面的脚本只找到第一个实例,因此在系统完成输出到文件之前文件被重命名。

Jac*_*ijm 5

下面的脚本将目录中的所有文件重命名为第二个找到的字符串中的id,以 开头ProcID:

1. 重命名为第二个匹配字符串中的 id(字面意思;无扩展名)

在此处输入图片说明

#!/usr/bin/env python3
import shutil
import os
import sys

dr = sys.argv[1]

for f in os.listdir(dr):
    file = os.path.join(dr, f)
    try:
        # only rename if the second instance exists
        new = [s for s in open(file).read().split() if s.startswith("(ProcID:")][1]
    except (IndexError, IsADirectoryError):
        pass
    else:
        # rename the file
        shutil.move(file, os.path.join(dr, new.split(":")[-1].strip()[:-1]))
Run Code Online (Sandbox Code Playgroud)

使用

  1. 将脚本复制到一个空文件中,另存为 rename_files.py
  2. 以目录为参数运行它:

    python3 /path/to/rename_files.py /path/to/directory_with_files
    
    Run Code Online (Sandbox Code Playgroud)

笔记

  • 该脚本采用(精确)格式: ProcID:0000014778
  • 如果没有(或根本没有)的第二个实例,脚本将不会重命名文件ProcID

2.只重命名.txt文件,并保留扩展名

...然后使用下面的版本,它只会重命名.txt文件并将扩展名保留在重命名的文件中。用法完全一样。

python3 /path/to/rename_files.py /path/to/directory_with_files
Run Code Online (Sandbox Code Playgroud)

脚本的作用


编辑

Python2 版本的脚本 1. OP 安装了 python2,这需要IOError而不是IsADirectoryError防止脚本运行到目录而不是文件中的错误。

#!/usr/bin/env python3
import shutil
import os
import sys

dr = sys.argv[1]

for f in os.listdir(dr):
    file = os.path.join(dr, f)
    try:
        # only rename is the second instance exists
        new = [s for s in open(file).read().split() if all([
            s.startswith("(ProcID:"), f.endswith(".txt")
            ])][1]
    except (IndexError, IsADirectoryError):
        pass
    else:
        shutil.move(file, os.path.join(dr, new.split(":")[-1].strip()[:-1]+".txt"))
Run Code Online (Sandbox Code Playgroud)

...为了完整,第二个脚本的python2版本:

for f in os.listdir(dr)
Run Code Online (Sandbox Code Playgroud)