Обратите внимание, что когда вы выполняете - 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
}, ".")'
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
.
Используя 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
С помощью инструментов 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).
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 .)