将文件名分解为基于词典的文件夹

Breaking down a filename into lexicographic based folders

假设我在文件夹中有数千张格式为 filename_order.jpg 的图像。

folder/
  6398305_0.jpg
  6398305_1.jpg
  6398305_2.jpg
  ...
  6399305_0.jpg

有没有一种简单的方法可以根据文件名将它们分类到平等重新分区的文件夹中?

folder/
  6/3/9/
     8/3/0/5/
        6398305_0.jpg
        6398305_1.jpg
        6398305_2.jpg
  ...
     9/3/0/7/
        6399307_0.jpg

是否还有一种方法可以进行反向操作:给定一个嵌套的树结构,仅将其返回到级别 1。

目标是能够以高效的方式将它们存储在 S3 中以存储数百万张图像。

谢谢。

嵌套平面文件夹,

cp -R flat_folder/ nested_folder/
cd nested_folder/

for f in *_[0-9].jpg
do
    filename=${f%.*}
    extension=${f##*.}
    number=${filename%_*}
    index=${filename##*_}

    folder=$(echo $number | sed 's/\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)\(.\)/\/\/\/\/\/\//')
    mkdir -p $folder
    mv $f $folder/
done

拼合嵌套文件夹,

cd nested_folder/
find . -name "*.jpg" -exec cp {} ../flat_folder/ \;

这会在纯 Bash:

#!/usr/bin/env bash

# extglob needed to expand number into a serie of folders path
shopt -s extglob

# Starting folder name
folder=folder
# Iterate all *.jpg files in folder
for file in "$folder/"*.jpg; do

  # Remove leading directory path from file to get basename
  basename="${file##*/}"

  # Remove everything ater first _ to get only numbers
  numbers="${basename%_*}"

  # Insert / before each number to create a directory path from numbers
  # Need Bash extglob
  dir="$folder${numbers//?()/\/}"

  # Create the directory path
  echo mkdir -p "$dir"

  # move file to its directory
  echo mv "$file" "$dir/"
done

如果输出符合您的预期,请删除 echo