
В настоящее время я пытаюсь написать скрипт, который организует список файлов в подкаталоги по их датам. Даты содержатся в первой строке каждого файла в формате 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