Intereting Posts
Хотите запустить и подключиться к лёгкому FTP-серверу на моей машине список всех каталогов, содержащих * .html-файлы, а также список файлов в каталогах Не просыпаться после приостановки Как я могу динамически переключать выходной пункт сценария или команды? Как заставить Debian запускать скрипт m python при запуске? Предпочтительный способ установки функций bash? Почему я не могу использовать политику REJECT в своей цепочке iptables OUTPUT? выйдите из сценария, если строка ls не нашла соответствия Эмулировать отсоединение сетевого кабеля с помощью qemu-kvm Есть ли простая ОС GNU / Linux? Как я могу получить эту проприетарную камеру с низким разрешением, работающую в Linux? Использование ключевого файла в качестве пароля с OpenSSL Почему вход в канал хорошо подходит для zenity, но <файловые неполадки? Получение уже установленного раздела x86 для Windows на KVM Экран Gnu: загрузка нескольких файлов конфигурации

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

Как я могу сократить эту команду? objective состоит в том, чтобы отобразить последние 3 файла, которые находятся в папке ABC и соответствуют uvw в имени файла, а затем сделать то же самое, но соответствовать xyz в имени файла.

Я хочу сократить это, так как есть необходимость добавить больше строк для поиска в будущем.

 find . -name 'ABC' | xargs ls | grep -i uvw |sort| tail -n 3; find . -name 'ABC' | xargs ls | grep -i xyz |sort| tail -n 3 

Пример вывода:

 2018-06-23T01-23-56.919Z-UVW.gz 2018-06-23T01-29-56.556Z-UVW.gz 2018-06-23T23-26-14.463Z-UVW.gz 2018-08-08T00-16-22.923Z-xyz.js 2018-08-08T00-16-24.517Z-xyz.js 2018-08-08T00-16-25.427Z-xyz.js 

С 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) : квалификатор glob
  • D : включить скрытые файлы и заглянуть внутрь скрытых папок, как это делает find
  • [-3,-1] : выберите только последние 3 (по умолчанию сортировка происходит в лексическом порядке)
  • :t : модификатор, который извлекает хвост пути к файлу (базовое имя), как ваш ls .

Обратите внимание, что если имеется несколько каталогов ABC, имя этих каталогов будет влиять на сортировку (файлы в a/ABC будут отображаться раньше, чем в b/ABC ).

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

 for fragment in ABC UVW xyz; do find . -name "\*${fragment}\*" | sort | tail -n3; done 

Если вы хотите найти файлы, которые соответствуют всем им, вы можете сделать что-то вроде этого:

 find . -name '*ABC*' -a -name '*xyz*' | sort | tail -n3 

-a – логический оператор AND оператора find .

Для BSD find используйте -or и -and а не -o и -a .

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

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

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

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

Вид и 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