BASH:根据文件名进行文件排序

用户4007276

我需要根据名称将 12000 个填充物分为 1000 个组,并为每个组创建一个包含该组填充物的新文件夹。每个文件的名称以多列格式给出(带 _ 分隔符),其中第二列从 1 到 12(零件编号)变化,最后一列从 1 到 1000(系统编号),表明最初 1000 个不同的系统(最后一列)被拆分为 12 个独立的部分(第二列)。下面是一个基于 3 个系统的小子集的示例,该系统由 12 个部分组成,总共 36 个填充。

7000_01_lig_cne_1.dlg
7000_02_lig_cne_1.dlg
7000_03_lig_cne_1.dlg
...
7000_12_lig_cne_1.dlg

7000_01_lig_cne_2.dlg
7000_02_lig_cne_2.dlg
7000_03_lig_cne_2.dlg
...
7000_12_lig_cne_2.dlg

7000_01_lig_cne_3.dlg
7000_02_lig_cne_3.dlg
7000_03_lig_cne_3.dlg
...
7000_12_lig_cne_3.dlg

我需要根据它们名称的第二列 (01, 02, 03 .. 12) 对这些填充进行分组,从而创建 1000 个文件夹,这些文件夹应按以下方式为每个系统限制 12 个填充:

 Folder1, name: 7000_lig_cne_1, it contains 12 filles:   7000_{this is from 01 to 12}_lig_cne_1.dlg

 Folder2, name: 7000_lig_cne_2, it contains 12 filles 7000_{this is from 01 to 12}_lig_cne_2.dlg
...
 Folder1000, name: 7000_lig_cne_1000, it contains 12 filles 7000_{this is from 01 to 12}_lig_cne_1000.dlg

假设所有 *.dlg 填充都存在于同一个目录中,我建议使用 bash 循环工作流,它只缺少一些排序功能(sed、awk ??),按以下方式组织:

#set the name of folder with all DLG
home=$PWD
FILES=${home}/all_DLG/7000_CNE
# set the name of protein and ligand library to analyse
experiment="7000_CNE"

#name of the output
output=${home}/sub_folders_to_analyse

#now here all magic comes
rm -r ${output}
mkdir ${output}

# sed sollution
for i in ${FILES}/*.dlg        # define this better to suit your needs
do 
    n=$( <<<"$i" sed 's/.*[^0-9]\([0-9]*\)\.dlg$/\1/' )
    # move the file to proper dir
    mkdir -p ${output}/"${experiment}_lig$n"
    cp "$i" ${output}/"${experiment}_lig$n"
done

注意:在那里我将每个文件夹的名称表示为 ${experiment},我在最后添加了最后一列 $n 的编号。是否可以每次根据复制的填充名称自动设置新文件夹的名称?手动它可以通过跳过文件夹名称中的第二列来实现

 cp ./all_DLG/7000_*_lig_cne_987.dlg ./output/7000_lig_cne_987
卡米尔库克

迭代文件。从文件名中提取目标目录名。移动文件。

for i in *.dlg; do
    # extract last number with your favorite tool
    n=$( <<<"$i" sed 's/.*[^0-9]\([0-9]*\)\.dlg$/\1/' )
    # move the file to proper dir
    echo mkdir -p "folder$n"
    echo mv "$i" "folder$n"
done

笔记:

  • 不要在脚本中使用大写变量。使用小写变量。
  • 请记住引用变量扩展。
  • 使用http://shellcheck.net检查您的脚本
  • repl 上测试

更新:对于 OP 的文件夹命名约定:

for i in *.dlg; do
    foldername="$HOME/output/${i%%_*}_${i#*_*_}"
    echo mkdir -p "$foldername"
    echo mv "$i" "$foldername"
done

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Bash:根据文件名对文件进行排序

根据python中的文件名对文件进行排序

Bash如何知道何时进行文件名扩展?

Bash-根据多个字段对文件名进行排序

根据文件名与文件夹Python匹配对文件进行排序

根据文件名中间的版本号对文件进行排序

需要帮助根据文件名中的日期戳对文件列表进行排序

根据文件名中嵌入的时间戳对文件进行排序、分组和处理

根据文件名对带有解析的url的文件列表进行排序

如何使用bash shell参数扩展进行文件名操作

根据文件大小以及打印文件名和大小对文件(包括子目录中的文件)进行排序

Bash 按包含年份和缩写月份的文件名对文件进行排序

根据文件名的相似性对文件排序

根据复杂文件名中的字符串日期对数组进行排序

如何根据时间戳对grep命令中显示的文件名进行排序?

Python:根据文件名上指定的日期从文件夹中读取文件并进行排序

如何对多个文件名部分上的文件进行排序?

使用bash根据文件名(日期)移动日志文件

根据文件名 bash 创建文件夹

如何根据文件名将文件名排序到文件夹中

根据文件扩展名对文件进行排序

如何对使用Directoryinfo读取的文件名进行排序

以升序对目录中的文件名进行排序

按数字值对文件名进行排序

如何在ruby中对文件名进行排序?

grep 对过滤器文件名进行排序

C ++在目录中对文件名进行排序

如何对包含数字的文件名进行排序

根据文件名中的文本对列表进行分区