将所有文件移动到以部分文件名命名的子目录中

扎卡里亚·乌尔卡伊德(Zakariae oulqaid)

我有一个目录,其中包含很多文件,这些文件的名称由artirst的姓名和专辑组成,例如: 在此处输入图片说明

现在的任务是遍历每个文件,创建以艺术家的名字命名的目录,并以文件名作为相册,然后将文件移至该目录。

最终结构应如下所示: 在此处输入图片说明

我将如何仅使用基本的shell命令来执行此操作?

jesse_b

这基本上可以满足您的要求,尽管您要求很多,所以请让我知道您是否有任何困惑的地方,我将尽力向他们解释:

#!/usr/bin/env bash

song_dir="$HOME/tmp/songs"
out_dir="$HOME/tmp/org_songs"

[[ ! -d "$out_dir" ]] && mkdir -p "$out_dir"

get_artist () {
    local a=($(tr '_' ' ' <<<"$1"))
    for i in "${a[@]}"; do
        if [[ $i =~ artiste.* ]]; then
            printf '%s\n' "${i#*=}"
            break
        fi
    done
}

get_album () {
    local a=($(tr '_' ' ' <<<"$1"))
    for i in "${a[@]}"; do
        if [[ $i =~ album.* ]]; then
            printf '%s\n' "${i#*=}"
            break
        fi
    done
}

get_song () {
    local a=($(tr '_' ' ' <<<"$1"))
    for i in "${a[@]}"; do
        if [[ $i =~ song.* ]]; then
            printf '%s\n' "${i#*=}"
            break
        fi
    done
}

for song in "${song_dir}/"*.mp3; do
    bname=$(basename "$song")
    artist=$(get_artist "$bname")
    album=$(get_album "$bname")
    sname=$(get_song "$bname")
    [[ ! -d "${out_dir}/${artist}/${album}" ]] && mkdir -p "${out_dir}/${artist}/${album}"
    cp "$song" "${out_dir}/${artist}/${album}/${sname}"
done

正在使用:

前:

$ tree
.
├── script.sh
└── songs
    ├── artiste=linkin-park_album=meteora_id=02_song=Don't-stay.mp3
    ├── artiste=linkin-park_album=meteora_id=02_song=Session.mp3
    ├── artiste=linkin-park_album=meteora_id=02_song=Somewhere-I-Belong.mp3
    ├── artiste=linkin-park_album=minutes-of-midnight_id=04_song=Bleed-It-Out.mp3
    ├── artiste=linkin-park_album=minutes-of-midnight_id=04_song=Given-Up.mp3
    ├── artiste=linkin-park_album=minutes-of-midnight_id=04_song=Leave-out-All-The-Rest.mp3
    ├── id=01_artiste=eminem_album=recovery_song=cold-wind-blows.mp3
    ├── id=01_artiste=eminem_album=recovery_song=on-fire.mp3
    └── id=01_artiste=eminem_album=recovery_song=talking-2-myself-(feat-kobe).mp3

1 directory, 10 files

后:

$ tree
.
├── org_songs
│   ├── eminem
│   │   └── recovery
│   │       ├── cold-wind-blows.mp3
│   │       ├── on-fire.mp3
│   │       └── talking-2-myself-(feat-kobe).mp3
│   └── linkin-park
│       ├── meteora
│       │   ├── Don't-stay.mp3
│       │   ├── Session.mp3
│       │   └── Somewhere-I-Belong.mp3
│       └── minutes-of-midnight
│           ├── Bleed-It-Out.mp3
│           ├── Given-Up.mp3
│           └── Leave-out-All-The-Rest.mp3
├── script.sh
└── songs
    ├── artiste=linkin-park_album=meteora_id=02_song=Don't-stay.mp3
    ├── artiste=linkin-park_album=meteora_id=02_song=Session.mp3
    ├── artiste=linkin-park_album=meteora_id=02_song=Somewhere-I-Belong.mp3
    ├── artiste=linkin-park_album=minutes-of-midnight_id=04_song=Bleed-It-Out.mp3
    ├── artiste=linkin-park_album=minutes-of-midnight_id=04_song=Given-Up.mp3
    ├── artiste=linkin-park_album=minutes-of-midnight_id=04_song=Leave-out-All-The-Rest.mp3
    ├── id=01_artiste=eminem_album=recovery_song=cold-wind-blows.mp3
    ├── id=01_artiste=eminem_album=recovery_song=on-fire.mp3
    └── id=01_artiste=eminem_album=recovery_song=talking-2-myself-(feat-kobe).mp3

7 directories, 19 files

另请注意,我cp用来复制文件而不是mv移动文件我建议仅先进行复制,然后再删除旧文件,只要一切正常即可。否则,您可能会弄乱或丢失一些数据。

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

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

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将所有文件移动到文件名开头的子目录中

来自分类Dev

如何将子目录中的所有文件递归移动到单个目录?

来自分类Dev

将所有文件和目录移动到Windows中的新子目录

来自分类Dev

如何将子目录中的所有文件递归移动到单个目录?

来自分类Dev

将递增值写入子目录中与文件名匹配的所有文件

来自分类Dev

将目录中的所有文件移动到同一目录中的新子目录

来自分类Dev

PHP使用子目录作为新文件名重命名所有文件

来自分类Dev

将文件移动到父目录,并在文件名之前加上子目录名

来自分类Dev

将所有具有相同名称的文件从子目录移动到一个目录中

来自分类Dev

将所有文件从子目录移动到父目录

来自分类Dev

将多个文件移动到Linux中的子目录

来自分类Dev

将多个文件移动到Linux中的子目录

来自分类Dev

将.txt文件移动到子目录中

来自分类Dev

将Windows环境中的文件移动到部分文件名的文件夹中

来自分类Dev

如何将所有子目录移动到bash中的父文件夹中?

来自分类Dev

将所有子子目录的内容仅移动到其子目录中

来自分类Dev

从所有子目录移动特定文件,并根据子目录重命名

来自分类Dev

在主目录中创建命名为文件的子目录,并将文件移动到相应的子目录

来自分类Dev

如何将具有特定文件扩展名的所有文件从子目录移动到单个目录

来自分类Dev

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

来自分类Dev

重命名子目录中的所有文件

来自分类Dev

重命名不同子目录中的所有文件

来自分类Dev

移动所有文件在特定的子目录中

来自分类Dev

如何从所有子目录中获取特定的文件名?

来自分类Dev

将除一个文件夹外的所有文件夹移动到子目录-git

来自分类Dev

将文件从子目录递归移动到父目录中的文件夹

来自分类Dev

CMD迭代并递归重命名所有文件名,并将当前子目录文件夹追加到当前文件名

来自分类Dev

Linux循环将文件移动到其子目录

来自分类Dev

无法将文件移动到其自身的子目录

Related 相关文章

  1. 1

    将所有文件移动到文件名开头的子目录中

  2. 2

    如何将子目录中的所有文件递归移动到单个目录?

  3. 3

    将所有文件和目录移动到Windows中的新子目录

  4. 4

    如何将子目录中的所有文件递归移动到单个目录?

  5. 5

    将递增值写入子目录中与文件名匹配的所有文件

  6. 6

    将目录中的所有文件移动到同一目录中的新子目录

  7. 7

    PHP使用子目录作为新文件名重命名所有文件

  8. 8

    将文件移动到父目录,并在文件名之前加上子目录名

  9. 9

    将所有具有相同名称的文件从子目录移动到一个目录中

  10. 10

    将所有文件从子目录移动到父目录

  11. 11

    将多个文件移动到Linux中的子目录

  12. 12

    将多个文件移动到Linux中的子目录

  13. 13

    将.txt文件移动到子目录中

  14. 14

    将Windows环境中的文件移动到部分文件名的文件夹中

  15. 15

    如何将所有子目录移动到bash中的父文件夹中?

  16. 16

    将所有子子目录的内容仅移动到其子目录中

  17. 17

    从所有子目录移动特定文件,并根据子目录重命名

  18. 18

    在主目录中创建命名为文件的子目录,并将文件移动到相应的子目录

  19. 19

    如何将具有特定文件扩展名的所有文件从子目录移动到单个目录

  20. 20

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

  21. 21

    重命名子目录中的所有文件

  22. 22

    重命名不同子目录中的所有文件

  23. 23

    移动所有文件在特定的子目录中

  24. 24

    如何从所有子目录中获取特定的文件名?

  25. 25

    将除一个文件夹外的所有文件夹移动到子目录-git

  26. 26

    将文件从子目录递归移动到父目录中的文件夹

  27. 27

    CMD迭代并递归重命名所有文件名,并将当前子目录文件夹追加到当前文件名

  28. 28

    Linux循环将文件移动到其子目录

  29. 29

    无法将文件移动到其自身的子目录

热门标签

归档