将文件排序到以文件前缀命名的目录中

2 sort files

我有一堆这样的文件

5830_1.png
5830_2.png
5830_3.png
5831_1.png
5832_1.png
5832_2.png
Run Code Online (Sandbox Code Playgroud)

我想将这些文件全部分类到以文件名前缀作为目录名称的目录中。

所以我最终会

5830/
    5830_1.png
    5831_2.png
    ...etc
5831/
5832/
Run Code Online (Sandbox Code Playgroud)

是否有捷径可寻?

sav*_*nto 8

POSIXsh单线:

for file in *.png; do mkdir -p -- "${file%%_*}" && \
    mv -- "$file" "${file%%_*}"; done
Run Code Online (Sandbox Code Playgroud)

解释:

  • 循环遍历.png当前目录中的每个文件。
  • mkdir带有文件前缀;${file%%_*}删除第一个下划线及其后的所有内容;如果目录已经存在,则-p确保mkdir将保持安静。
  • mv 文件进入目录。

根据以下 HalosGhost 的建议,如果所需的最终结构是

5830/
    1.png
    2.png
    3.png
5831/
    1.png
5832/
    1.png
    2.png
Run Code Online (Sandbox Code Playgroud)

上面的 one-liner 可以稍微修改一下:

for file in *.png; do mkdir -p -- "${file%%_*}" && \
    mv -- "${file}" "${file%%_*}/${file##*_}"; done
Run Code Online (Sandbox Code Playgroud)

这次,目标由目录${file%%_*}$file下划线之前)和新文件名${file##*_}$file下划线之后)组成。