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

Jan*_*ick 3 shell bash files

我有一个目录,其中包含很多名称由 8 个随机字母、数字、_ 和 - 组成的文件,例如:

0dckGYH5.jpg
32Pz5-WQ.png
32_17pxH.png
Hsf4BQW9.jpg
xh-fa3Nu.gif
zYtBEaKA.png
...
Run Code Online (Sandbox Code Playgroud)

现在的任务是遍历每个文件,创建一个以文件名的前 2 个字符命名的目录,然后将文件移动到该目录中。

最终结构应如下所示:

0d
??? 0dckGYH5.jpg
32
??? 32Pz5-WQ.png
??? 32_17pxH.png
Hs
??? Hsf4BQW9.jpg
xh
??? xh-fa3Nu.gif
zY
??? zYtBEaKA.png
Run Code Online (Sandbox Code Playgroud)

由于我无权在系统上安装任何东西,我将如何仅使用基本的 shell 命令来执行此操作?

ste*_*ver 7

的简单组合mkdir -p,并mv应有足够

for f in *; do d="${f:0:2}"; mkdir -p "$d"; mv -t "$d" -- "$f"; done
Run Code Online (Sandbox Code Playgroud)

演示:

$ ls
0dckGYH5.jpg  32_17pxH.png  32Pz5-WQ.png  Hsf4BQW9.jpg  xh-fa3Nu.gif  zYtBEaKA.png

$ for f in *; do d="${f:0:2}"; mkdir -p "$d"; mv -t "$d" -- "$f"; done

$ tree .
.
??? 0d
?   ??? 0dckGYH5.jpg
??? 32
?   ??? 32_17pxH.png
?   ??? 32Pz5-WQ.png
??? Hs
?   ??? Hsf4BQW9.jpg
??? xh
?   ??? xh-fa3Nu.gif
??? zY
    ??? zYtBEaKA.png

5 directories, 6 files
Run Code Online (Sandbox Code Playgroud)

如果您的系统版本mkdir没有该-p选项,那么您可以明确测试该目录的存在,例如

 for f in *; do d="${f:0:2}"; [[ -d "$d" ]] || mkdir "$d"; mv -t "$d" -- "$f"; done
Run Code Online (Sandbox Code Playgroud)