根据文件名的一部分创建文件夹

根据文件名的一部分创建文件夹

我有几个文件名称如下:

KILN_SDUS51_N0SILN_201203020003
KILN_SDUS51_N0QILN_201203020003
KILN_SDUS51_N0RILN_201203020003

我需要根据_和之间的三个字符ILN(即N0S,,N0Q)将它们全部归档到文件夹中N0R

我一直在尝试编写一个 bash 脚本来执行此操作,但我发现大多数类似的例子都使用 f% 参数,这在这种情况下似乎不适用。

答案1

类似这样的事情应该做:

for file in ./*_???ILN*; do
    dir=${file%ILN*}
    dir=${dir##*_}
    mkdir -p "./$dir" &&
    mv -iv "$file" "./$dir"
done

常见问题 100有关 bash 中的字符串操作的更多信息。

答案2

在python中:

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

dr = sys.argv[1]; files = os.listdir(dr)
for f in [f for f in files if os.path.isfile(dr+"/"+f)]:
    folder = dr+"/"+f.split("_")[2].replace("ILN", "")
    if not os.path.exists(folder):
        os.makedirs(folder)
    shutil.move(dr+"/"+f, folder+"/"+f)

将其复制到一个空文件中,
通过以下方式运行:

python3 <script> <directory>

如有必要,这将创建(子)文件夹,将文件移动到文件夹中

答案3

使用grep

#!/bin/bash
for file in ./KILN_SDUS51_*; do
    dir="$(grep -Po "^.*_.*_\K.*(?=ILN)" <<<"$file")"
    mkdir "$dir" && mv "$file" "$dir"
done

相关内容