Найдите файлы между двумя временами/часами, используя find

Вы могли бы сделать что-то вроде:

tr ' ' '\n' <infile \
 | sort -n \
 | uniq -c \
 | awk '{ seen[$1]++ } END{for (x in seen) print seen[x], x }'

Или даже:

tr ' ' '\n' <infile | sort -n | uniq -c|cut -d' ' -f7 |sort |uniq -c

Или лучше обойтись awkв одиночку:

awk '{ seen[$0]++ } 
    END{ for (x in seen) count[seen[x]]++; for (y in count) print count[y],y }
' RS='( |\n)+' infile
3 1
1 2
1 3
1 4

В приведенном выше awk, в seen[$0]++для каждой записи R S , разделенной либо пробелом, либо \newline, вся запись сохраняется в связанном массиве с именем seenкак ключ, и его значение увеличивается при повторном просмотре того же ключа.

В END{... }, когда все записи будут прочитаны, этот блок будет выполнен, и для каждого ключа (мы определяем xкак индекс переменной для обхода всех элементов в этом массиве, используя цикл for ), сохраненный в видимом массиве, мы использовали значение , видимое seen[x], в качестве ключа нового массива с именем count, и снова его значение увеличивалось для того же ключа.

Позже мы использовали другой цикл и yв качестве индекса переменной, чтобы вывести сначала их значения count[y](, которые являются счетчиками )и yключами.

0
13.02.2020, 13:10
2 ответа

Один способ с bash, файлы между 20:00и22:00

#!/usr/bin/env bash

for f in /folder/x/*.bak; do
  var=$(date -r "$f" '+%H:%M')
  if [[ $var > '20:00' && $var < '22:00' ]]; then                                                                                                                                          
    echo "$f"
  fi
done
  • Приведенный выше код должен соответствовать вашим файлам.
  • Просто измените на [[ $var < '20:15' ]]Если это именно то, что вам нужно.
  • Этот синтаксис dateработает как с GNU, так и с BSDdate(1)
  • .

РЕДАКТИРОВАТЬ :Обновленный ответ

0
28.04.2021, 23:23

Благодаря ответу Джетчизеля я смог найти решение:

   #!/bin/bash

   for file in /folder/X/*.bak; do
     MODIFIED_DATE=$(stat --format="%y" $file | awk '{print $2}')

     if [[ $MODIFIED_DATE < '20:15' ]]; then
       printf 'rm -rf %s\n' "$file"
     fi
   done

stat --format="%y"показывает дату последнего изменения в этом формате 2020-02-02 19:11:34.000000000 +0100. Используя awk, я выбираю время, которое мне нужно, и с его помощью я могу определить, был ли файл создан до 20 :15, и таким образом удалить его. Это не чистый -вкладыш, но, по крайней мере, работает :).

0
28.04.2021, 23:23

Теги

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