我正在处理位于同一目录中的一组 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 变量。