Вы можете использовать find
и некоторое время прочитать l oop. В ваших примерах даты уже есть в именах файлов, поэтому это должно работать.
#!/usr/bin/env bash
##: Populate the array named folders with folders.
folders=(folder1 folder2 folder3 another_folder new_folder)
##: Set the date limit in a variable.
limit=1996-01
##: Loop through the output of find using a while read loop.
while IFS= read -rd '' files; do
files=${files##*/}
files=${files#*[!0-9]-}
if [[ $files < $limit ]]; then ##: If the date in the filenames is older than the set limit.
echo rm -rf "$files" ##: Delete the files
else
echo "$files is newer than $limit"
fi ##: Use find to look for files ending in .txt
done < <(find "${folders[@]}" -type f -name '*.txt' -print0)
Альтернативой является использование BASH_REMATCH
для извлечения даты из имен файлов.
#!/usr/bin/env bash
folders=(folder1 folder2 folder3 another_folder new_folder)
limit=1996-01
while IFS= read -rd '' files; do ##: BASH_REMATCH to extract the dates.
if [[ $files =~ .*([[:digit:]]{4}-[[:digit:]]{2}).*\.txt$ ]]; then
if [[ ${BASH_REMATCH[1]} < $limit ]]; then ##: The > inside [[ ]] does the trick.
echo rm -rf "$files"
else
echo "$files is newer than $limit"
fi
fi
done < <(find "${folders[@]}" -type f -name '*.txt' -print0)
Это просто покажет вам, что будет удалено / выполнено, удалите echo
перед rm
, если вы считаете, что вывод правильный, и убедитесь, что резервное копирование файлов на всякий случай.
Если во всех подпапках есть больше файлов, заканчивающихся на *.txt
, то вам нужно указать, насколько глубоко каталог вы собираетесь удалите файлы вместо folder1
, вам нужно сделать folder1/subfolder/another/folder
, пока не дойдете до интересующей вас подпапки.