我正在处理位于同一目录中的12个填充。填充的名称以由 _ 分隔的多列格式给出。这是那 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 的表达式,这些表达式引用了第二列的编号(在每个文件的名称中)。
由于您的文件名结构相当规则,您可以cut
用来提取该字段。但是,正如@steeldriver 所指出的,由于您的文件路径$PWD/ALL_DLG
已经包含一个_
,您要么必须明确考虑这一点,要么使用该basename
命令确保该操作仅应用于实际文件名,而不是任何路径组件:
n=$(basename "$f" | cut -d'_' -f 2)
会将cut
命令(_
用作字段分隔符)应用于文件名,并提取第二个字段(即您要标识的数字)。然后它会n
通过命令替换将结果写入 shell 变量。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句