Максимальная длина командной строки - это общий размер в байтах, а не количество аргументов. Файлы размером 40 КБ с именами вида / imr_report_repo / *
означают минимум около 800 КБ, возможно, больше. Это выше предела.
Очевидное решение - заставить find
выполнить рекурсию за вас. Переходите от глубины 1 к глубине 1 вместо глубины 0 до глубины 0.
find /imr_report_repo/ -mindepth 1 -maxdepth 1 -type f -mtime +15 -delete
В отличие от оригинала сюда входят файлы, имена которых начинаются с .
(точечные файлы). Если вы этого не хотите, исключите их:
find /imr_report_repo/ -mindepth 1 -maxdepth 1 -name '.*' -prune -o -type f -mtime +15 -delete
Большинство находят
реализации, которые имеют -maxdepth
, также имеют -delete
. Если у вас нет, не просто перенаправляйте результат в при чтении
: он несколько медленный и разбивается на имена файлов, содержащие символы новой строки (и обратную косую черту и конечные пробелы, потому что вы использовали read
, где вы должны были использовать IFS = read -r
). Используйте -exec
, вот для чего он нужен.
find /imr_report_repo/ -mindepth 1 -maxdepth 1 -type f -mtime +15 -exec rm -f {} +
Вам нужно использовать awk
, как показано ниже. Сначала сохраните URL-адрес в переменной, а затем в строке Status
, если он OK
получает имя файла из следующей строки. Это должно работать в GNU awk
, так как функции match()
потребуется третий аргумент для сохранения захваченной группы в массиве.
awk '/^--/{ url = $NF }
/^[[:space:]]+Status/ && $NF == "OK" { getline nextline; match(nextline, /filename="(.+)"/,arr); print url, arr[1] }' file
i=`awk '/Status: 200 OK/{x=NR+1}(NR<x){getline;print $NF}' filename | awk -F "=" '{print $NF}'| sed 's/"//g'`
awk '{a[++i]=$0}/Status: 200 OK/{for(x=NR-7;x<=NR;x++)print a[x]}' filename | awk -v i="$i" '/https:/{$1=$2="";print $0 " " i}'
выход
https://www.example/download/123456789 myfile123.zip