Организация файлов по датам, содержащимся в них

Организация файлов по датам, содержащимся в них

В настоящее время я пытаюсь написать скрипт, который организует список файлов в подкаталоги по их датам. Даты содержатся в первой строке каждого файла в формате YYYY-MM-DD. Я извлек первую строку из каждого файла с помощью команды head и заменил на , -так /что теперь это YYYY/MM/DD. Это нужно, чтобы я мог использовать его как путь к файлу.

Затем я хочу создать подкаталоги, YYYY>MM>DDгде, например, файл, содержащий дату, 2015/10/19хранится в пути файла ./2015-> ./2015/10-> ./2015/10/19. Эти подкаталоги должны быть созданы в ~/fileList/.

Вот код, который у меня есть на данный момент.

for file in ~/fileList/*
do
   head -1 $file | tr "-" "/")
done

Это пример файла

2001-02-03
Thursday
Paris
44952

Я пытаюсь найти способ создания подкаталогов и сохранения каждого файла в правильном каталоге. Любые предложения по коду были бы очень признательны.

Я использую оболочку bash.

решение1

Необходимо сделать следующее:

for file in ~/fileList/*
do
    newpath=$(head -1 "$file" | tr '-' '/')
    mkdir -p "$newpath"
    echo "would now execute 'mv $file $newpath'"
done

Это сохранит преобразованную дату в переменной $newpathи создаст этот каталог вместе с любыми отсутствующими родителями, если он еще не существует. Подкаталог будет создан в каталоге, где вы запустите скрипт.

В текущей форме он выведет команду, которая будет выполнена. Когда вы будете удовлетворены, измените на

mv "$file" "$newpath"

Обновлять:Поскольку вы указали, что целевые каталоги будут располагаться ниже исходного каталога, в котором изначально находятся ваши файлы, необходимо провести проверки, чтобы убедиться, что при многократном запуске скрипта он не наткнется на эти вновь созданные записи.

  • Если вы можете идентифицировать файлы по их расширению (например, .txt), вы можете сделать цикл более конкретным:
    for file in ~/fileList/*.txt
    do
        newpath=~/fileList/$(head -1 "$file" | tr '-' '/')
        ...
    done
    
  • В противном случае один из способов — принимать в качестве операндов только обычные файлы:
    for file in ~/fileList/*
    do
        if [[ ! -f $file ]]; then continue; fi
        newpath=~/fileList/$(head -1 "$file" | tr '-' '/')
        mkdir -p "$newpath"
        mv "$file" "$newpath"
    done
    

Связанный контент