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

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

我有一堆这样的文件

5830_1.png
5830_2.png
5830_3.png
5831_1.png
5832_1.png
5832_2.png

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

所以我最终会得到

5830/
    5830_1.png
    5831_2.png
    ...etc
5831/
5832/

是否有捷径可寻?

答案1

POSIXsh一行:

for file in *.png; do mkdir -p -- "${file%%_*}" && \
    mv -- "$file" "${file%%_*}"; done

解释:

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

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

5830/
    1.png
    2.png
    3.png
5831/
    1.png
5832/
    1.png
    2.png

上面的一行可以稍微修改一下:

for file in *.png; do mkdir -p -- "${file%%_*}" && \
    mv -- "${file}" "${file%%_*}/${file##*_}"; done

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

答案2

我曾多次不得不做这样的事情来整理一堆文件。我发现 bash 变量扩展是你的朋友。

   ${parameter%word}
   ${parameter%%word}

删除匹配的后缀模式。该单词被扩展以产生一个模式,就像路径名扩展一样。

初始设置:

-rw-r--r-- 1 falsenames falsenames 0 Jun  5 17:35 5830_1.png
-rw-r--r-- 1 falsenames falsenames 0 Jun  5 17:35 5830_2.png
-rw-r--r-- 1 falsenames falsenames 0 Jun  5 17:35 5830_3.png
-rw-r--r-- 1 falsenames falsenames 0 Jun  5 17:35 5831_1.png
-rw-r--r-- 1 falsenames falsenames 0 Jun  5 17:35 5832_1.png
-rw-r--r-- 1 falsenames falsenames 0 Jun  5 17:35 5832_2.png


$ for i in $(find . -maxdepth 1 -type f); do mkdir -p ${i%_*};mv -v $i ${i%_*}; done
'./5830_3.png' -> './5830/5830_3.png'
'./5831_1.png' -> './5831/5831_1.png'
'./5830_1.png' -> './5830/5830_1.png'
'./5832_1.png' -> './5832/5832_1.png'
'./5832_2.png' -> './5832/5832_2.png'
'./5830_2.png' -> './5830/5830_2.png'

您也可以使用“-name *png”或 find 上的其他一些标志来获得更具体的信息。我通过将 maxdepth 设置为仅检查指定目录的查找来运行它。这样,如果将更多图像添加到该目录,则无需修改即可再次运行。我还使用 % 而不是 %%,这样如果您必须指定包含下划线的完整目录(例如“/home/user/my_files/pngs”),这不会中断

$ for i in $(find move_files -maxdepth 1 -type f); do mkdir -p ${i%_*};mv -v $i ${i%_*}; done
'move_files/5830_3.png' -> 'move_files/5830/5830_3.png'
'move_files/5831_1.png' -> 'move_files/5831/5831_1.png'
'move_files/5830_1.png' -> 'move_files/5830/5830_1.png'
'move_files/5832_1.png' -> 'move_files/5832/5832_1.png'
'move_files/5832_2.png' -> 'move_files/5832/5832_2.png'
'move_files/5830_2.png' -> 'move_files/5830/5830_2.png'

相关内容