shell:根据名称中的模式进行文件管理

shell:根据名称中的模式进行文件管理

我正在处理位于同一目录中的一组 12 个 filles。填充的名称以多列格式给出,并用 _ 分隔。这是这 12 个填充物:

7000_01_lig_cne_767.dlg 7000_05_lig_cne_767.dlg 7000_09_lig_cne_767.dlg
7000_02_lig_cne_767.dlg 7000_06_lig_cne_767.dlg 7000_10_lig_cne_767.dlg
7000_03_lig_cne_767.dlg 7000_07_lig_cne_767.dlg 7000_11_lig_cne_767.dlg
7000_04_lig_cne_767.dlg 7000_08_lig_cne_767.dlg 7000_12_lig_cne_767.dlg

这里,填充之间的差异在第二列中给出(从 1 到 12),所有名称保持相同

我需要编写一个适合循环这些文件的简单 bash 工作流程,为每个文件创建一个目录(包含第二列中的数字,用作区分它们之间的模式),然后复制特定文件(例如 7000_04_lig_cne_767 .dlg)进入此目录(box_04)。因此,每个创建的子文件夹应仅包含 1 个文件。这是我的模板:

#!/bin/bash
#set the name of folder with all DLG
FILES=$PWD/ALL_DLG

#name of the subfolder in which several subfolders (containing one of the input file) whould be created
output=${home}/sub_folders_to_analyse


# manage DLG filles
for i in ${FILES}/*.dlg       
do 
    # write some expression to take the file according to the number indicated within its second column
    # n = is the number occured in the second column;
    # manage the files to proper directories
    mkdir -p ${output}/"box_$n"
    cp "$i" ${output}/"box_$n"
done

我想 for 循环中定义的 n 应该包含一些基于 SED 的表达式,引用第二列的编号(在每个文件的名称中)。

答案1

由于您的文件名结构相当规则,因此您可以用来cut提取该字段。然而,正如 @steeldriver 所指出的,由于您的文件路径$PWD/ALL_DLG已经包含 1 _,您要么必须明确考虑这一点,要么使用该basename命令来确保该操作仅应用于实际文件名,而不是任何路径组件:

n=$(basename "$f" | cut -d'_' -f 2)

会将cut命令(用作_字段分隔符)应用于文件名,并提取第二个字段(即您要识别的数字)。然后它会n通过命令替换将结果写入 shell 变量。

相关内容