将文件名分解为基于词典的文件夹
Breaking down a filename into lexicographic based folders
假设我在文件夹中有数千张格式为 filename_order.jpg
的图像。
- 文件名被编码为从 0000000 到 9999999 的 7 位整数
- 顺序是 0 到 9 之间的数字
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
。
假设我在文件夹中有数千张格式为 filename_order.jpg
的图像。
- 文件名被编码为从 0000000 到 9999999 的 7 位整数
- 顺序是 0 到 9 之间的数字
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
。