Учитывая два шаблона, поиск по конкретным каталогам и печатаю последние три имени файлов, которые соответствуют каждому рисунку

Вы можете использовать stat -c% w filename , он предоставит дату рождения в удобочитаемой форме, а -C предоставит временную метку unix.

Время рождения поддерживается не во всех файловых системах; в этих случаях используйте stat -c% z , то есть время последнего изменения.

4
08.08.2018, 22:10
4 ответа

Это будет искать любые файлы, которые соответствуют любому из этих фрагментов:

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.

2
27.01.2020, 20:48

С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).

4
27.01.2020, 20:48

Скорее всего, вы ищете

find. -iregex '.*/ABC/[^/]*uvw.*' | sort | tail -n3

Вот как это работает:

  • -iregexпоиск в режиме без учета регистра
  • .*/ABC/искать на любой глубине каталог ABC (полное имя каталога)
  • [^/]*uvw.*За именем каталога ABCнепосредственно следует имя файла, содержащее строку uvw, а не какие-либо подкаталоги -между ними

Части sortи tailостаются нетронутыми.

Что касается добавления других шаблонов :вам нужно сделать цикл по этой команде со всеми необходимыми строками, или если вам нужно только 3 файла, независимо от того, из какой группы они идут, вы можете объединить все в одну команду:

find. -iregex '.*/ABC/[^/]*\(uvw\|xyz\)[^/]*' | sort | tail -n3
2
27.01.2020, 20:48

Я получил то, что мне было нужно, с циклами 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
1
27.01.2020, 20:48

Теги

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