按日期将文件排序到子文件夹中 - bash

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 不太熟悉,但如果有人可以向我解释一下发生了什么,我很想让它工作?

谢谢你!

Sha*_*ins 6

我似乎找到了一个适合我的答案,这在 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)