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

扎卡里亚·乌尔卡伊德(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 条评论
登录 后参与评论

相关文章

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

在子目录中查找部分文件名

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

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

将具有特定扩展名的文件从目录移动到 PHP 中的子目录

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

对于目录,将具有子目录名称+旧文件名的子目录中的文件重命名为新目录

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

如何使用通过FTP的骆驼路由将所有文件从目录(包括子目录)移动到特定目录,而目标中没有子目录?

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

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

在目录及其所有子目录中搜索文件名而不识别子目录中的文件

删除多个子目录中的部分文件名

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

将子目录中的所有文件移动到工作目录中,并将路径添加为前缀

Bash / Shell将所有文件从子目录移动到目标目录?

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

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

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

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

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

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

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

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

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

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

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

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

在重命名后将子子目录文件移动到父目录的Shell脚本