Найти шаблон :отсортировать и удалить старые файлы

Весь смысл mktempзаключается в том, чтобы, цитируя его руководство, «безопасно создать временный файл или каталог». По сути, в скрипте вы можете написать

file="$(mktemp)"

или

dir="$(mktemp -d)"

и используйте любой из них по своему усмотрению, зная, что временный файл и каталог доступны только пользователю, выполнившему команду (, и root, конечно, в большинстве настроек ), и что они не t символическая ссылка на что-то другое и т. д. (Есть еще несколько предостережений; в частности, вам нужно проверить статус выхода, а родительский каталог должен быть безопасным для использования. Подробности см. в документации .)

mktemp -uне дает этих гарантий, поскольку отделяет построение имени файла от его использования; в скрипте вам нужно запустить(не делайте этого)

dir="$(mktemp -u)"
mkdir "$dir"
chmod 700 "$dir"

Между mktempи mkdirдругой процесс может создать каталог,с разным правом собственности; или, в случае файла, другой процесс может создать файл или создать на его месте символическую ссылку...

2
16.11.2021, 19:04
1 ответ

удалить "эхо" rmв последней строке, когда все будет в порядке

#!/bin/bash

# search dir
dir=./

# function conv PATTERN
conv() {
  # extract date from file name: 06_15_2021 5_20_00 am
  date=${1%.*}
  date=${date##*.}

  # sanitize date string: 06/15/2021 5:20:00-am
  date=${date//[^0-9AaPpMm]/-}
  date=${date/-//}
  date=${date/-//}
  date=${date/-/ }
  date=${date/-/:}
  date=${date/-/:}

  # print epoch time
  date --date="$date" +%s || return 1
  return 0
}

# search: *m.csv
for file in "$dir"*[Mm].[Cc][Ss][Vv]
  do
    [ -f "$file" ] || continue
    # file name: bb_co_ddee_354_m.err.06_15_2021 5_20_00 am.csv
    file=${file##*/}
    # base name: bb_co_ddee_354_m
    name=${file%%.*}
    # suffix: ddee_354_m
    del=${name#*_}
    del=${del#*_}
    # short name = base name - _suffix: bb_co
    name=${name%_$del}
    # convert date
    date=$(conv "$file") || continue

    # search short name: bb_co_*m.csv
    for search in "${dir}${name}"_*[Mm].[Cc][Ss][Vv]
      do
        # delete older file
        date2=$(conv "${search##*/}") || continue
        [ "$date" -gt "$date2" ] && echo rm "$search"
    done
done
2
16.11.2021, 23:08

Теги

Похожие вопросы