Вы можете использовать stat -c% w filename
, он предоставит дату рождения в удобочитаемой форме, а -C
предоставит временную метку unix.
Время рождения поддерживается не во всех файловых системах; в этих случаях используйте stat -c% z
, то есть время последнего изменения.
Это будет искать любые файлы, которые соответствуют любому из этих фрагментов:
for fragment in ABC UVW xyz; do
find. -name "\*${fragment}\*" | sort | tail -n3;
done
Если вы хотите найти файлы, которые соответствуют всем из них, вы можете сделать что-то вроде этого:
find. -name '*ABC*' -a -name '*xyz*' | sort | tail -n3
-a
— это find
логический оператор И.
Для BSD find
используйте -or
и -and
, а не -o
и -a
.
Сzsh
:
set -o extendedglob # best in ~/.zshrc
for w (uvw xyz) printf '%s\n' **/ABC/(#i)*$w*(D[-3,-1]:t)
**/
:любой уровень подкаталогов (#i)
:сопоставление без учета регистра для последующего (D[-3,-1]:t)
:квалификатор глоба D
:включать скрытые файлы и просматривать скрытые каталоги, как это делает find
[-3,-1]
:выбрать только последние 3 (глобы по умолчанию сортируются в лексическом порядке):t
:модификатор , который извлекает конец пути к файлу (базовое имя ), как это делает ваш ls
. Обратите внимание, что при наличии нескольких каталогов ABC имена этих каталогов будут влиять на сортировку (файлов в a/ABC
и они будут отображаться перед файлами вb/ABC
).
Скорее всего, вы ищете
find. -iregex '.*/ABC/[^/]*uvw.*' | sort | tail -n3
Вот как это работает:
-iregex
поиск в режиме без учета регистра .*/ABC/
искать на любой глубине каталог ABC (полное имя каталога)[^/]*uvw.*
За именем каталога ABC
непосредственно следует имя файла, содержащее строку uvw
, а не какие-либо подкаталоги -между ними Части sort
и tail
остаются нетронутыми.
Что касается добавления других шаблонов :вам нужно сделать цикл по этой команде со всеми необходимыми строками, или если вам нужно только 3 файла, независимо от того, из какой группы они идут, вы можете объединить все в одну команду:
find. -iregex '.*/ABC/[^/]*\(uvw\|xyz\)[^/]*' | sort | tail -n3
Я получил то, что мне было нужно, с циклами for в скрипте bash, можно ли сделать это в командной строке?
#!/bin/bash
for i in ABC DEF
do
for j in uvw xyz
do
x=`find. -iname $i | xargs ls | grep -i $j | sort | tail -n 3`
echo "$x"
done
done