Sha*_*ins 5 sorting directory bash command-line command
基本上我的硬盘崩溃了,我能够恢复所有文件,但是,所有文件都保留了它们的元数据,有些文件保留了它们的名称,我有 274000 个图像,我或多或少需要按日期对文件夹进行排序。
因此,假设它从第一个文件开始,它将从文件中获取日期,创建一个子文件夹,直到日期发生变化,继续将该文件移动到创建的文件夹中,一旦日期发生变化,它将创建一个新文件夹并继续做同样的事情。
我确信这是可能的,我真的不想手动执行此操作,因为这需要几周的时间......
假设我有一个目标文件夹 /target/
目标包含 274000 个文件,根本没有子文件夹。
文件夹结构应为/target/YY/DD_MM/filenames
我想为此创建一个 bash 脚本,但我不太确定从这里开始哪里。
我发现了这个:
#!/bin/bash
DIR=/home/data
target=$DIR
cd "$DIR"
for file in *; do
dname="$( date -d "${file%-*}" "+$target/%Y/%b_%m" )"
mkdir -vp "${dname%/*}"
mv -vt "$dname" "$file"
done
Run Code Online (Sandbox Code Playgroud)
创建文件夹而不检查它是否存在会删除该文件夹内的文件吗?
我也不太确定在目录路径名中添加星号会做什么?
我对 bash 不太熟悉,但如果有人可以向我解释一下发生了什么,我很想让它工作?
谢谢你!
我似乎找到了一个适合我的答案,这在 OSX 上对三个文件运行得很好,在我在巨大的文件夹上运行它之前,你们能检查一下这不会在某个地方失败吗?
#!/bin/bash
DIR=/Users/limeworks/Downloads/target
target=$DIR
cd "$DIR"
for file in *; do
# Top tear folder name
year=$(stat -f "%Sm" -t "%Y" $file)
# Secondary folder name
subfolderName=$(stat -f "%Sm" -t "%d-%m-%Y" $file)
if [ ! -d "$target/$year" ]; then
mkdir "$target/$year"
echo "starting new year: $year"
fi
if [ ! -d "$target/$year/$subfolderName" ]; then
mkdir "$target/$year/$subfolderName"
echo "starting new day & month folder: $subfolderName"
fi
echo "moving file $file"
mv "$file" "$target/$year/$subfolderName"
done
Run Code Online (Sandbox Code Playgroud)