根据目录名称将目录划分为子目录

根据目录名称将目录划分为子目录

背景:客户的网站将用户个人资料照片和其他附件存储在一个平面文件夹中/user/images/*user_id*。他们最近达到了目录限制(echo */ | wcechoes 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 的循环中,该循环逐行读取输入。

相关内容