根据文件名将文件排序到多个目录中?

itsViney

我在一个目录中有数千个文件,我想根据它们的文件名将它们分类到子目录中。它们都以p- [number] _n- [number] _a- [number]。[ext]的集合结构一致地命名。

这是一个小样本...

  • p-12345_n-987_a-1254.jpg
  • p-12345_n-987_a-9856.pdf
  • p-12345_n-987_a-926.docx
  • p-12345_n-384_a-583.pdf
  • p-12345_n-384_a-987.pdf
  • p-2089_n-2983_a-2348.gif
  • p-2089_n-1982_a-403.jpeg
  • p-38422_n-2311_a-126.pdf
  • p-38422_n-2311_a-5231.docx

我需要的是这样的文件夹结构:

p-12345
  ⊢ n-987
    ⊢ p-12345_n-987_a-1254.jpg
    ⊢ p-12345_n-987_a-9856.pdf
    ⊢ p-12345_n-987_a-926.docx
  ⊢ n-384
    ⊢ p-12345_n-384_a-583.pdf
    ⊢ p-12345_n-384_a-987.pdf
p-2089
  ⊢ n-2983
    ⊢ p-2089_n-2983_a-2348.gif
  ⊢ n-1982
    ⊢ p-2089_n-1982_a-403.jpeg
p-38422
  ⊢ n-2311
    ⊢ p-38422_n-2311_a-126.pdf
    ⊢ p-38422_n-2311_a-5231.docx

我希望这是有道理的。

是否可以编写脚本来以这种方式组织文件?

编辑:澄清:是的,我的问题应该是如何编写脚本来组织文件?:)我对Unix和一般命令行来说是新手。到目前为止,我仅编写/使用了基本的Shell脚本。我有一个预感,答案可能会涉及正则表达式,但是除此之外,我不确定从哪里开始。

我想出的最好的主意是

  1. 将文件列表导出到文本文件
  2. 查找并将“ _n”和“ _a”替换为“ / n”和“ / a”
  3. 从中创建一系列的mv命令
  4. 将其另存为Shell脚本

我敢肯定,这比需要做的要长得多。我还希望有一些可重复的内容,以防将来需要为更多文件做这些事情。

管理员蜂

如前所述,简短的答案是“是”。

长答案是:您可以使用bash脚本来完成此任务,该脚本awk用于提取要作为目录结构基础的文件名元素。看起来可能像这样(在这里,更多的重点放在可读性上而不是“单行”紧凑性)。

#!/bin/bash


for FILE in p-*
do
    if [[ ! -f $FILE ]]; then continue; fi

    LVL1="$(awk '{match($1,"^p-([[:digit:]]+)_[[:print:]]*",fields); print fields[1]}' <<< $FILE)"
    LVL2="$(awk '{match($1,"^p-([[:digit:]]+)_n-([[:digit:]]+)_[[:print:]]*",fields); print fields[2]}' <<< $FILE)"

    echo "move $FILE to p-$LVL1/n-$LVL2"
    if [[ ! -d "p-$LVL1" ]]
    then
    mkdir "p-$LVL1"
    fi

    if [[ ! -d "p-$LVL1/n-$LVL2" ]]
    then
    mkdir "p-$LVL1/n-$LVL2"
    fi

    mv $FILE "p-$LVL1/n-$LVL2"
done

解释:

  • 我们对当前目录中所有以“ p-”开头的文件执行循环。
  • 循环中的第一条指令确保文件存在,并且是空目录的一种解决方法(之所以必须这样做是因为,在此论坛上,始终会告诉您不要解析的输出ls,因此FILES=$(ls p-*); for FILE in $FILES; do ...类似的内容视为不行)。
  • 然后,我们使用(正如您怀疑的那样,使用正则表达式)提取介于p-之间的数字_n以生成目录结构的第一级,第二级第二级awk之间的数字相同想法是使用该函数,函数不仅查找输入中指定正则表达式出现的位置,而且还为您提供数组“字段”中用圆括号括起来的所有元素的“完成”值n-_amatch( ... )
  • 第三,我们检查预期目录结构的第一级和第二级目录是否已经存在。如果没有,我们创建它们。
  • 最后,我们将文件移动到目标目录。

有关更多信息,请参阅《高级bash脚本指南》和《GNU Awk用户指南》

一旦您对脚本和正则表达式更加坚定,就可以使它变得更加紧凑。例如,在上面的脚本中,目录/子目录路径的生成可以很容易地压缩为一个awk调用。

  • 首先,由于目录名称实际上是 p-<number>n-<number>,与文件名中的相同,我们也可以awk通过编写以下内容来为我们提取这些字符:match($1,"(^p-[[:digit:]]+)_(n-[[:digit:]]+)_[[:print:]]*",fields)

  • awk通过使用合适的参数同时生成目录-子目录路径,我们可以进一步减轻工作负担print

awk '{match($1,"(^p-[[:digit:]]+)_(n-[[:digit:]]+)_[[:print:]]*",fields); print fields[1] "/" fields[2]}'

将很容易产生(例如)p-12345/n-384file p-12345_n-384_a-583.pdf如果我们将其与mkdir -p@wurtel所指示的用法结合使用,脚本可能看起来像

for FILE in p-*
do
    if [[ ! -f $FILE ]]; then continue; fi

    TARGET="$(awk '{match($1,"(^p-[[:digit:]]+)_(n-[[:digit:]]+)_[[:print:]]*",fields); print fields[1] "/" fields[2]}' <<< $FILE)"
    echo "move $FILE to $TARGET"

    mkdir -p "$TARGET"
    mv $FILE $TARGET
done

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

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

来自分类Dev

按日期和文件名将文件排序到目录

来自分类Dev

根据文件名将文件复制到某些目录

来自分类Dev

根据文件名将文件移动到目录中

来自分类Dev

在 Bash 中,根据文件名将文件移动到目录

来自分类Dev

根据文件名将R中的多个csv与索引合并

来自分类Dev

是否有linux命令根据文件名将文件复制到其他多个文件?

来自分类Dev

根据文件名将文件移动到排序的文件夹中

来自分类Dev

在linux中根据文件名将大量文件移动到目录中

来自分类Dev

根据文件名将多个文件移动到它们自己的文件夹中

来自分类Dev

根据文件名将文件移动到多个子文件夹中

来自分类Dev

如何根据文件名将文件分类到文件夹中-Windows CMD

来自分类Dev

AWK-创建新的子目录并根据文件名将文件移动到该子目录中

来自分类Dev

如何按文件名将300k +行文本排序到数组中?

来自分类Dev

Bash脚本可根据部分文件名将文件归档到文件夹中

来自分类Dev

重命名多个文件,同时使用UNIX中的动态文件名将它们移动到其他目录

来自分类Dev

Python - 根据文件名将其他 excel 文件中的特定列复制到新的列

来自分类Dev

根据文件名将文件复制到单个文件夹

来自分类Dev

根据tar文件名将文件解压缩到目标目录

来自分类Dev

如何根据文件名创建多个目录并在linux中更改文件名?

来自分类Dev

根据文件名中的日期将文件排序到文件夹中?

来自分类Dev

MSBuild:使用复制任务根据文件名将文件列表复制到不同位置

来自分类Dev

批处理文件帮助:根据文件名将文件分类到专门命名的文件夹中,但有例外

来自分类Dev

根据某些文件名模式将文件排序并移动到目录中

来自分类Dev

使用.bat按文件名将文件分类到文件夹中

来自分类Dev

Linux根据文件名模式将文件批量复制到目录中

来自分类Dev

根据Powershell中的文件名将文件移动到新位置

来自分类Dev

根据 hdfs 目录中的文件名计算文件数

来自分类Dev

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

Related 相关文章

  1. 1

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

  2. 2

    按日期和文件名将文件排序到目录

  3. 3

    根据文件名将文件复制到某些目录

  4. 4

    根据文件名将文件移动到目录中

  5. 5

    在 Bash 中,根据文件名将文件移动到目录

  6. 6

    根据文件名将R中的多个csv与索引合并

  7. 7

    是否有linux命令根据文件名将文件复制到其他多个文件?

  8. 8

    根据文件名将文件移动到排序的文件夹中

  9. 9

    在linux中根据文件名将大量文件移动到目录中

  10. 10

    根据文件名将多个文件移动到它们自己的文件夹中

  11. 11

    根据文件名将文件移动到多个子文件夹中

  12. 12

    如何根据文件名将文件分类到文件夹中-Windows CMD

  13. 13

    AWK-创建新的子目录并根据文件名将文件移动到该子目录中

  14. 14

    如何按文件名将300k +行文本排序到数组中?

  15. 15

    Bash脚本可根据部分文件名将文件归档到文件夹中

  16. 16

    重命名多个文件,同时使用UNIX中的动态文件名将它们移动到其他目录

  17. 17

    Python - 根据文件名将其他 excel 文件中的特定列复制到新的列

  18. 18

    根据文件名将文件复制到单个文件夹

  19. 19

    根据tar文件名将文件解压缩到目标目录

  20. 20

    如何根据文件名创建多个目录并在linux中更改文件名?

  21. 21

    根据文件名中的日期将文件排序到文件夹中?

  22. 22

    MSBuild:使用复制任务根据文件名将文件列表复制到不同位置

  23. 23

    批处理文件帮助:根据文件名将文件分类到专门命名的文件夹中,但有例外

  24. 24

    根据某些文件名模式将文件排序并移动到目录中

  25. 25

    使用.bat按文件名将文件分类到文件夹中

  26. 26

    Linux根据文件名模式将文件批量复制到目录中

  27. 27

    根据Powershell中的文件名将文件移动到新位置

  28. 28

    根据 hdfs 目录中的文件名计算文件数

  29. 29

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

热门标签

归档