将大量文件移动到日期结构化目录顺序中

Pad*_*igD 5 shell-script rename files

我在这个目录中有大约 100 万个文件: /home/username/images/

每个文件的名称类似于:012345678910(Place)_0_20120414185957_28841.jpg文件名的时间戳部分在每张图片上都发生了变化。

下面的代码包含将文件排序/移动到此日期结构中的代码: /home/username/sorted/2012/04/14/18/name_of_file.jpg

对于一小部分文件它工作正常,但对于巨大的目录,我的腻子终端在输出后断开连接

Directory $newdir does not exist.  Creating same.
Run Code Online (Sandbox Code Playgroud)

我有其他代码总是随着错误代码而死亡argument list too long

这是代码:

#!/bin/bash
ALLFILES=(images/*)
for ((i=0; i<${#ALLFILES[*]}; i+=30000));
do
    set $(echo "${ALLFILES[@]:i:30000}" | awk -F_ '{print $1, $2, $3, $4, $5}')
    fullyear=$3
    year=$(echo $fullyear |cut -c1-4)
    month=$(echo $fullyear |cut -c5-6)
    day=$(echo $fullyear |cut -c7-8)
    hour=$(echo $fullyear |cut -c9-10)
    newdir=$(echo /home/username/sorted/$year/$month/$day/$hour/)
    if ! [ -d $newdir ]; then
        echo Directory $newdir does not exist.  Creating same.
        mkdir -p $newdir;
    fi
    mv "${ALLFILES[@]:i:30000}" $newdir;
done
Run Code Online (Sandbox Code Playgroud)

任何想法为什么在执行大循环时连接不会保持?

rus*_*ush 5

尝试在屏幕会话中运行它。或者甚至尝试另一种结构。我相信 find + sed 会比纯 bash 工作得更好:

find images/ -name "*.jpg" | sed 's%^[^_]*_[^_]*_\([0-9][0-9][0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\).*%mkdir -p "/home/username/sorted/\1/\2/\3/\4" \&\& mv "&" "/home/username/sorted/\1/\2/\3/\4/"%'
Run Code Online (Sandbox Code Playgroud)

这只是为了展示 sed 如何执行命令。e在 last 之后添加%将强制执行命令:

find images/ -name "*.jpg" | sed 's%^[^_]*_[^_]*_\([0-9][0-9][0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\)\([0-9][0-9]\).*%mkdir -p "/home/username/sorted/\1/\2/\3/\4" \&\& mv "&" "/home/username/sorted/\1/\2/\3/\4/"%e'
Run Code Online (Sandbox Code Playgroud)

附:你不需要在 bash 中使用

day=$(echo $fullyear |cut -c7-8)
Run Code Online (Sandbox Code Playgroud)

Bash 可以自己完成,而无需echo | cut

day=${fullyear:6:2}
Run Code Online (Sandbox Code Playgroud)