我有一个 Web 服务器,里面有上传的文件。有一个脚本为这些文件分配数字 ID,并将它们存储在相应的子目录中。
我现在有 32000 个这样的上传,对于服务器来说,在一个目录中处理太多了。我使用的脚本确实有一种方法可以“命名”上传,这样 ID 12345 就/files/12345
不会放在 中,而是放在 中/files/namespaced/000/012/345
。
代码可以很好地处理这个问题,但我现在有 32000 个子目录的命名方式不正确。有什么最简单的方法可以检查我现有的文件并将它们放在正确的位置?
答案1
这假设目录名称中没有任何奇怪的字符,例如空格或换行符,并且没有以点开头的文件名。
未经测试。
find /files -type d | while read -r dir
do
base="000000${dir##*/}"
new="/files/namespaced/${base: -9:3}/${base: -6:3}/${base: -3}"
mkdir -p "$new"
mv "$dir/*" "$new"
rmdir "$dir"
done
获取新目录名称的另一种方法:
new=$(echo "$dir" | sed 's|...$|/&|;s|\(.*\)/\(.*\)/\(...\)$|\1/namespaced/000000\2/\3|; s|\(.*\)/.*\(...\)\(...\)/\(...\)$|\1/\2/\3/\4|' "$dir")
答案2
我采用了更手动的方式。文件处于基础级别,我创建了所有文件夹,并在每个文件夹中手动复制了 1000 个 jpg 文件。bash 脚本的一部分是
mkdir 1-1000 1001-1999 2000-2999 3000-3999
ls *.jpg | head -1000 | while read line; do mv "$line" "1-1000"; done
我只需手动对另一个文件夹重复该命令,直到完成为止;如果文件顺序不重要,我还会将文件重命名为 sha1 字符串。