Найти файл с наименьшим 4-значным номером

Обратите внимание, что когда вы выполняете - mtime , проверяет возраст файла на момент запуска find .

Если вы не запустите его в очень маленьком дереве каталогов, find займет несколько миллисекунд (если не секунд или часов), чтобы просканировать дерево каталогов и выполнить lstat () на каждый файл. Таким образом, точность меньше секунды не обязательно имеет большой смысл.

Также обратите внимание, что не все файловые системы поддерживают метки времени с субсекундной детализацией.

Однако есть несколько вариантов.

С помощью find многих BSD и одного из schily-tools вы можете:

find . -atime -1s

Чтобы найти файлы, к которым последний раз доступ осуществлялся менее секунды назад ( по сравнению с тем, когда был запущен find ).

С zsh :

ls -ld -- **/*(Dms-1)

Для субсекундной детализации с инструментами GNU вы можете использовать справочный файл, время которого вы установили с помощью touch :

touch -ad '0.5 seconds ago' ../reference
find . -anewer ../reference

Или с последними версиями perl :

perl -MTime::HiRes=lstat,clock_gettime -MFile::Find -le '
  $start =  clock_gettime(CLOCK_REALTIME) - 0.5;
  find(
    sub {
      my @s = lstat $_;
      print $File::Find::name if @s and $s[8] > $start
    }, ".")'
1
16.03.2017, 17:25
4 ответа
perl -le '
   for ( grep { /^[a-zA-Z]+\d\.\d{2}\_\d.\d{4}\.end$/ } <*.end> ) {
      ($n) = /(\d{4})\.end$/;
      $min //= $n;
      $n <= $min and $min = $n, push @{$h{$min}}, $_;
   }
   print for @{$h{$min}};
'

<*> собирает все соответствующие файлы, используя синтаксис подстановки, из которых соответствующие файлы синтаксиса должны быть выбраны с помощью для .

Внутри для мы сначала извлекаем последние 4 цифры, чтобы определить и сравнить их с текущим минимумом и, если он найден, помещаем в хэш.

В конце мы просто печатаем содержимое хэша с ключом $ min .

0
27.01.2020, 23:19

Используя Bash, найдите и sort -t | --field-separator и -k | --key параметры:

find_files.sh :

#!/bin/bash
first_file=$(find . -iname '*.end' | sort -t '.' -k 4.1 | head -1)
IFS='.'
fields=($first_file)
unset IFS
find . -iname "*${fields[3]}.end"

Параметры -k | --key ожидают KEYDEF из форма field_number . номер_символа . Когда действует -t | --field-separator , номера полей вычисляются на основе указанного разделителя (в данном случае . ), а не пробела.

Затем мы извлекаем требуемый шаблон из первого файла, используя разделитель полей ввода Bash , и снова ищем в каталоге с помощью find файлы, соответствующие этому шаблону в случае, если несколько файлов совместно используют тот же 4-значный номер.

Пример:

$ ls -1
abc0.03_1.1921.end
def0.03_9.0311.end
ghi0.03_1.1966.end
jkl1.04_1.1916.end
mno2.04_4.9540.end
pab9.04_1.1994.end
uvx7.04_3.2002.end
yyy1.05_8.0311.end
zzz4.04_1.2097.end
$ ./find_files.sh
./yyy1.05_8.0311.end
./def0.03_9.0311.end
1
27.01.2020, 23:19

С помощью инструментов GNU вы можете сделать что-то вроде:

find . -regextype posix-extended \
  -regex '.*/[a-zA-Z]+[0-9]\.[0-9]{2}_[0-9]\.[0-9]{4}\.end' -print0 |
  awk -v RS='\0' -F . '
    NR == 1 || $(NF-1) < min {files=$0; min = $(NF-1); next}
    $(NF-1) == min {files = files "\n" $0}
    END {if (NR) print files}'

Это пример общего шаблона: мы печатаем список совпадающих файлов с разделителями NUL (поскольку NUL - единственный символ, который не может встречаться в пути к файлу. ) и обработайте этот вывод с помощью awk , где разделитель записей установлен на NUL (хотя не все реализации awk поддерживают это).

Разделитель полей установлен на . . NF - это количество полей, поэтому $ (NF-1) - это последнее предпоследнее поле. awk находит наименьшее число, сравнивая его с последним известным значением, и сохраняет соответствующие файлы в переменной files awk .

Поскольку мы храним список, разделенный новой строкой, а не NUL, он предназначен только для вывода пользователя. Если вы хотите надежно выполнить постобработку, вы должны вместо этого использовать NUL ( "\ 0" в awk).

2
27.01.2020, 23:19

sort содержит -t и -k , что позволит вам сортировать по одна из частей имени файла, разделенных точками, которая должна делать это в этом случае.

-t, --field-separator=SEP
    use SEP instead of non-blank to blank transition

-k, --key=KEYDEF
    sort via a key; KEYDEF gives location and type

(цитата из страницы руководства GNU sort .)

1
27.01.2020, 23:19

Теги

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