Весь смысл mktemp
заключается в том, чтобы, цитируя его руководство, «безопасно создать временный файл или каталог». По сути, в скрипте вы можете написать
file="$(mktemp)"
или
dir="$(mktemp -d)"
и используйте любой из них по своему усмотрению, зная, что временный файл и каталог доступны только пользователю, выполнившему команду (, и root, конечно, в большинстве настроек ), и что они не t символическая ссылка на что-то другое и т. д. (Есть еще несколько предостережений; в частности, вам нужно проверить статус выхода, а родительский каталог должен быть безопасным для использования. Подробности см. в документации .)
mktemp -u
не дает этих гарантий, поскольку отделяет построение имени файла от его использования; в скрипте вам нужно запустить(не делайте этого)
dir="$(mktemp -u)"
mkdir "$dir"
chmod 700 "$dir"
Между mktemp
и mkdir
другой процесс может создать каталог,с разным правом собственности; или, в случае файла, другой процесс может создать файл или создать на его месте символическую ссылку...
удалить "эхо" 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