背景:客户的网站将用户个人资料照片和其他附件存储在一个平面文件夹中/user/images/*user_id*
。他们最近达到了目录限制(echo */ | wc
echoes 31998
,文件系统为 ext3 ),所以我需要将它们分成更小的块。
用户文件夹/user/images
基于数据库中存储的用户 ID。有一些非基于数字的目录需要忽略。
我创建了一个小型 bash 脚本,它在我的测试环境中运行良好,但我想听听你对此的看法:
#!/usr/bin/env bash
for D in *; do
if [ -d "${D}" ]; then # check if it's a directory
echo "Directory: ${D}"
if [ "${D}" -eq "${D}" ] 2>/dev/null # check if directory is a valid integer / number based
then
pre=${D:0:1} # $pre = first letter of the directory name
echo "Subdir: ${pre}"
if [[ ! -d "${pre}" ]] # check if directory $pre exists
then
mkdir "${pre}" # directory $pre does not exist, create it
echo "Created subdir ${pre}..."
fi
mv "${D}" "${pre}" # move $d into $pre
echo "Moved ${D} into ${pre}..."
else
echo "Directory: ${D} is not number based, i.e. not based on a user id. Skipping..."
fi
fi
done
在服务器上运行它之前,我欢迎任何建议或优化技巧。
答案1
您可以使用mkdir -p
来避免检查目录是否存在,除非您确实需要该Created subdir ${pre}
消息。
由于您达到了目录限制,也许您想在其他地方创建新目录,将内容移动到其中(从而在完整目录中创建空间)并最终将新目录移回原始目录。
此外,使用-n
开关mv
可能有助于防止意外丢失数据。
最后一点——星号通配符扩展可能会超出 bash 的最大行长。如果是这种情况,您可以将输出导入ls -1
到基于 while 的循环中,该循环逐行读取输入。