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)
任何想法为什么在执行大循环时连接不会保持?
尝试在屏幕会话中运行它。或者甚至尝试另一种结构。我相信 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)
| 归档时间: |
|
| 查看次数: |
17263 次 |
| 最近记录: |