根据名称的第一个字母对文件和目录进行分组,并将它们移动到该字母的目录中

阿米尔·A·沙巴尼

我有一个包含以下内容的目录:

$ mkdir dir && cd "$_"
~/dir $ mkdir a1 a2 a3 a4 b1 c1 c2 1a 2a 2b 2c 2d 3a _1 _2
~/dir $ touch a_1 a_2 a_3 a_4 b_1 c_1 c_2 1_a 2_a 2_b 2_c 2_d 3_a __1 __2
~/dir $ ls
__1  1_a  __2  2_a  2_b  2_c  2_d  3_a  a_1  a_2  a_3  a_4  b_1  c_1  c_2
_1   1a   _2   2a   2b   2c   2d   3a   a1   a2   a3   a4   b1   c1   c2

现在我想根据它们的第一个字母对所有这些文件和目录进行分组,并将它们移动到相同字母的目录中所以输出将是:

~/dir $ ls
_  1  2  3  a  b  c

使用exa,树看起来像这样:

~/dir $ exa --tree
.
├── 1
│  ├── 1_a
│  └── 1a
├── 2
│  ├── 2_a
│  ├── 2_b
│  ├── 2_c
│  ├── 2_d
│  ├── 2a
│  ├── 2b
│  ├── 2c
│  └── 2d
├── 3
│  ├── 3_a
│  └── 3a
├── _
│  ├── _1
│  ├── _2
│  ├── __1
│  └── __2
├── a
│  ├── a1
│  ├── a2
│  ├── a3
│  ├── a4
│  ├── a_1
│  ├── a_2
│  ├── a_3
│  └── a_4
├── b
│  ├── b1
│  └── b_1
└── c
   ├── c1
   ├── c2
   ├── c_1
   └── c_2

我知道我可以使用通配符移动:

~/dir $ mkdir a && mv a* a

这会引发错误:

mkdir: cannot create directory ‘a’: File exists

但它完成了工作。我可以做这样的事情来避免错误:

~/dir $ mkdir temp && mv a* temp && mv temp a

然后我可以在 for 循环中为我知道的每个字母使用它。但问题是我不知道那些第一个字母可能是什么,我们有很多字母。有没有一种方法可以在不需要知道这些字母的情况下实现这一目标?

大学教师

只需迭代所有内容:

#!/bin/bash
for f in *; do 
    firstChar="${f:0:1}"; 
    mkdir -p -- "$firstChar"; 
    mv -- "$f" "$firstChar"; 
done

-p通知mkdir不抱怨,如果该目录已经存在,并且${f:0:1}是KSH /猛砸/岩组语法“得到第一个字符”。

这是在行动:

$ mkdir a1 a2 a3 a4 b1 c1 c2 1a 2a 2b 2c 2d 3a _1 _2
$ touch a_1 a_2 a_3 a_4 b_1 c_1 c_2 1_a 2_a 2_b 2_c 2_d 3_a __1 __2
$ ls -F
__1  _1/  1_a  1a/  __2  _2/  2_a  2a/  2_b  2b/  2_c  2c/  2_d  2d/  3_a  3a/  a_1  a1/  a_2  a2/  a_3  a3/  a_4  a4/  b_1  b1/  c_1  c1/  c_2  c2/

$ for f in *; do 
    firstChar="${f:0:1}"; 
    mkdir -p "$firstChar"; 
    mv -- "$f" "$firstChar"; 
done

$ tree
.
├── _
│   ├── __1
│   ├── _1
│   ├── __2
│   └── _2
├── 1
│   ├── 1_a
│   └── 1a
├── 2
│   ├── 2_a
│   ├── 2a
│   ├── 2_b
│   ├── 2b
│   ├── 2_c
│   ├── 2c
│   ├── 2_d
│   └── 2d
├── 3
│   ├── 3_a
│   └── 3a
├── a
│   ├── a_1
│   ├── a1
│   ├── a_2
│   ├── a2
│   ├── a_3
│   ├── a3
│   ├── a_4
│   └── a4
├── b
│   ├── b_1
│   └── b1
└── c
    ├── c_1
    ├── c1
    ├── c_2
    └── c2

22 directories, 15 files

请注意,如果您可以拥有只有一个字符的现有文件或目录名称,则会导致错误。例如,如果您创建一个名为的文件a并尝试上述方法,您将获得:

mkdir: cannot create directory ‘a’: File exists
mv: 'a' and 'a' are the same file

如果这是一个问题,您可以执行一些复杂的操作,例如重命名为临时文件、创建目录并将文件移动到其中:

for f in *; do 
    firstChar="${f:0:1}";
    ## if the first character exists as a dir, move the file there
    if [[ -d "$firstChar" ]]; then
       mv -- "$f" "$firstChar"; 
    ## if it exists but is not a dir, move to a temp location,
    ## re-create it as a dir, and move back from temp
    elif [[ -e "$firstChar" ]]; then
        tmp=$(mktemp ./tmp.XXXXX)
        mv -- "$firstChar" "$tmp"
        mkdir -p "$firstChar"
        mv -- "$tmp" "$firstChar"/"$f"
    else    
        mkdir -p "$firstChar"; 
        mv -- "$f" "$firstChar"; 
    fi
done

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将文件夹移动到自己的第一个字母目录中

来自分类Dev

根据扩展名对文件进行排序并将它们移动到它们的目录中

来自分类Dev

根据第一个字符将目录移动到子目录中

来自分类Dev

如何重命名目录名称,将名称字符串中每个单词的第一个字母替换为大写?

来自分类Dev

按属性第一个字母对对象数组进行分组

来自分类Dev

按第一个字母android将arraylist中的字符串名称分组

来自分类Dev

如何仅通过.bat文件知道第一个字母时将文件移动到文件夹

来自分类Dev

Oracle PL / SQL从名称(HUN)中获得第一个字母

来自分类Dev

大写文件中的第一个字母

来自分类Dev

在外壳中按第一个字段对文件中的行进行排序,第一个字段被视为数字

来自分类Dev

获取字母矢量的字母顺序的第一个和最后一个字母

来自分类Dev

按名称(可变最后一个字母)将文件移动到文件夹

来自分类Dev

在一个句子组中,所有以相同字母开头的单词,并根据单词的第一个字符对其进行排序

来自分类Dev

如何监视目录中的新文件并将它们移动/重命名到另一个目录?

来自分类Dev

截断UILabel和UITextField中的第一个字母而不是最后一个字母?

来自分类Dev

如果第一个字母是R中的特定字母,则创建新列

来自分类Dev

词组的第一个字母

来自分类Dev

删除每行的第一个字母

来自分类Dev

匹配单词的第一个字母

来自分类Dev

获取索引的第一个字母?

来自分类Dev

根据字段值中的第一个字符对文档进行排序

来自分类Dev

使用String方法将Java中的第一个和最后一个字母大写

来自分类Dev

如何从字符串中删除第一个和最后一个字母

来自分类Dev

如何根据文件名的第一个字母将文件组织到AZ文件夹中

来自分类Dev

如何根据文件名的第一个字母将文件组织到AZ文件夹中

来自分类Dev

如何将不包含一个特定目录的文件和目录移动到该目录

来自分类Dev

Python如何大写单词的第一个字母和最后三个字母

来自分类Dev

仅将第一个文件从任何目录移动到当前目录

来自分类Dev

打印视图中的第一个字母但我不需要重复该字母

Related 相关文章

  1. 1

    将文件夹移动到自己的第一个字母目录中

  2. 2

    根据扩展名对文件进行排序并将它们移动到它们的目录中

  3. 3

    根据第一个字符将目录移动到子目录中

  4. 4

    如何重命名目录名称,将名称字符串中每个单词的第一个字母替换为大写?

  5. 5

    按属性第一个字母对对象数组进行分组

  6. 6

    按第一个字母android将arraylist中的字符串名称分组

  7. 7

    如何仅通过.bat文件知道第一个字母时将文件移动到文件夹

  8. 8

    Oracle PL / SQL从名称(HUN)中获得第一个字母

  9. 9

    大写文件中的第一个字母

  10. 10

    在外壳中按第一个字段对文件中的行进行排序,第一个字段被视为数字

  11. 11

    获取字母矢量的字母顺序的第一个和最后一个字母

  12. 12

    按名称(可变最后一个字母)将文件移动到文件夹

  13. 13

    在一个句子组中,所有以相同字母开头的单词,并根据单词的第一个字符对其进行排序

  14. 14

    如何监视目录中的新文件并将它们移动/重命名到另一个目录?

  15. 15

    截断UILabel和UITextField中的第一个字母而不是最后一个字母?

  16. 16

    如果第一个字母是R中的特定字母,则创建新列

  17. 17

    词组的第一个字母

  18. 18

    删除每行的第一个字母

  19. 19

    匹配单词的第一个字母

  20. 20

    获取索引的第一个字母?

  21. 21

    根据字段值中的第一个字符对文档进行排序

  22. 22

    使用String方法将Java中的第一个和最后一个字母大写

  23. 23

    如何从字符串中删除第一个和最后一个字母

  24. 24

    如何根据文件名的第一个字母将文件组织到AZ文件夹中

  25. 25

    如何根据文件名的第一个字母将文件组织到AZ文件夹中

  26. 26

    如何将不包含一个特定目录的文件和目录移动到该目录

  27. 27

    Python如何大写单词的第一个字母和最后三个字母

  28. 28

    仅将第一个文件从任何目录移动到当前目录

  29. 29

    打印视图中的第一个字母但我不需要重复该字母

热门标签

归档