Получить дату из имени файла и удалить файл, если дата раньше определенной даты - PullRequest
1 голос
/ 25 апреля 2020

У меня есть несколько файлов в нескольких подпапках, например:

folder1
 - folder1a
  - dira
     -dirb
       - folder-1999-07-05.txt
       - folder-1999-07-04.txt
       - folder-1999-07-03.txt
       - 1999-07-02_a2-abcd.txt

folder2
 - folder2a
  - dira
     -dirb
       - folder-1995-07-05.txt
       - folder-1995-07-04.txt
       - folder-1995-07-03.txt
       - 1995-07-02_a2-abcd.txt

Теперь, если я хочу удалить файлы старше определенной даты (например, 1996-01), что было бы лучше / самый эффективный подход?

1 Ответ

1 голос
/ 25 апреля 2020

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...