“который” с небольшим “grep” - как решение?

Используйте этот сценарий Bash для получения списка со всеми временно сохраненными видео Flash:

#!/usr/bin/env bash

for flashpid in $(pgrep -f flashplayer.so); do
    cd "/proc/$flashpid/fd"
    for video in $(file * | grep '/tmp/Flash' | sed 's/\(^[0-9]*\).*/\1/g'); do
        echo "/proc/$flashpid/fd/$video"
    done
done

Mark сценарий как исполняемый файл и работайте, например, для смотрения видео, следующего:

flashget.sh | xargs mplayer

Объяснение

Начиная с Flash 10.1, всех /tmp записи файловой системы становятся удаленными, как только Flash player открывает их. Но сам файл все еще существует, так как ядро только удаляет файл, если hardlinks не делают больше существует. Только Флеш-плагин знает, где файл/видео. К счастью ядро может сказать нам, которых имеют процессы, какие дескрипторы файлов открываются. Так, существуют все еще hardlinks для этих файлов, расположенных в /proc/$PID/fd.

4
14.10.2014, 16:26
8 ответов

В zsh:

echo $path/mkdi*(N)

В других оболочках, для потребления человеком:

set -f; IFS=:
for x in $PATH; do set +f; ls $x/mkdi* 2>/dev/null; done
4
27.01.2020, 20:46
  • 1
    @LanceBaynes, это - лучший ответ, чем мой. –  glenn jackman 21.07.2011, 05:00
  • 2
    Хороший, но не подобный grep. никакой regex здесь. –  Philomath 21.07.2011, 18:28
  • 3
    @Philomath В ksh, ударе и zsh, подстановочные знаки являются regexps (с необычным синтаксисом). –  Gilles 'SO- stop being evil' 21.07.2011, 18:40
  • 4
    ~something как это спасибо Caleb –  LanceBaynes 26.07.2011, 09:08

расположиться

locate mkdi

Обновление: это ограничит вывод файлами в $PATH

locate mkdi | 
while read filename; do 
  [[ ":$PATH:" == *:$(dirname $filename):* ]] && echo $filename
done
4
27.01.2020, 20:46
  • 1
    locate ищет целую файловую систему на основе базы данных, в отличие от этого which который ищет файлы в $PATH согласно текущему состоянию. –  Philomath 20.07.2011, 21:59
  • 2
    В моей системе, которая возвращает тысячи файлов, которые, оказывается, находятся в папке проекта с тем строковым фрагментом как часть пути. Не замена для which. –  Caleb 20.07.2011, 22:55
  • 3
    немного лучший путь на практике locate bin/mkdi. Однако, это смотрит в общедоступных частях файловой системы (или безотносительно updatedb индексы), без рассмотрения $PATH. –  Gilles 'SO- stop being evil' 21.07.2011, 00:27
  • 4
    Обратите внимание, что, если Вы хотите искать подобный grep (regex), необходимо передать -r или --regex кому: locate. Это - все еще базирующаяся база данных, все же. –  Philomath 21.07.2011, 18:31

run-parts может сделать точно что, учитывая правильные параметры. Вот простая обертка, которую я записал вокруг этого:

#!/bin/bash
# swhich - search the path (like which) but with support for regular expressions
# "swhich '.*ch$' '^wh'" to find all in path ending with 'ch' and all starting with 'wh'
set -f; IFS=:
for all in $PATH
  do
  set +f
  for each in "$@"
    do
    run-parts --list --regex "$each" "$all"
  done
done
4
27.01.2020, 20:46

Если Вы не уверены в исполняемом файле, Вы ищете, можно также запросить man база данных с apropos команда, например apropos dir перечислит команды, наиболее часто используемые при работе с каталогами, найти команду, которой Вы нуждаетесь, передаете его which как нормальный.

2
27.01.2020, 20:46
  • 1
    ЕСЛИ исполняемый файл имеет страницу справочника, И Вы сделали makewhatis недавно. –  Philomath 21.07.2011, 01:20

compgen Bash, встроенный, который генерирует завершения для данной строки. -c переключатель завершает названия команды в пути:

$ compgen -c mkd
mkdirhier
mkdir
mkdiskimage
mkdir

Примечание: mkdir идет здесь дважды, потому что это находится и в / мусорном ведре и в/usr/bin в моей системе.

Программируемое завершение прохладно. Это позволит Вам сделать вещи как это:

$ shopt -s progcomp; complete -c which # set up progcomp
$ which mkd<ALT-*>
$ which mkdir mkdirhier mkdiskimage

... который может быть ближе к тому, что Вы ищете.

2
27.01.2020, 20:46

Вот еще один способ получить двоичный путь (если префикс известен) при помощи printf и имя файла globbing в Bash.

mywhich() (
  bin="$1"
  PATH="${PATH// /\\ }"  # escape spaces
  #eval 'echo "$PATH"'
  #printf '%s\n' "printf '%s\n' ${PATH//://${bin}* }/${bin}*" | bash -s -f -O nullglob --
  result="$(printf '%s\n' "printf '%s\n' ${PATH//://${bin}* }/${bin}*" | bash -s +f -O nullglob --)"
  [[ -n "$result" ]] && printf '%s\n' "$result" && exit 0 || exit 1
)

mywhich mkdi
0
27.01.2020, 20:46

Следующий подход перечисляет все полные пути к подобранным двоичным файлам с помощью только Bash builtins:

# mywhich version 2
mywhich() ( # using a subshell the parent shell is not affected by set & shopt, ...
  bin="$1"
  set +f
  shopt -s nullglob
  IFS=':' read -a array <<<"$PATH"
  IFS=""
  result="$( printf '%s\n' ${array[@]/%//${bin}*} )"
  [[ -n "$result" ]] && printf '%s\n' "$result" && exit 0 || exit 1
)

mywhich mkdi
0
27.01.2020, 20:46

Ищите страницы человека

, поскольку вы ищете команды, вместо того, чтобы соответствовать именам двоичных файлов команд, вы могли бы сопоставить имена страниц человека как альтернативы; Это может иметь смысл, потому что MAN уже дает эту функцию по умолчанию:

$ man --sections=1,8 --where --all --regex '^mkdi' 
/usr/share/man/man1/mkdir.1.gz
/usr/share/man/man1/mkdirhier.1.gz
/usr/share/man/man1/mkdiskimage.1.gz

с использованием SED , чтобы извлечь только имена команд:

$ man --sections=1,8 --where --all --regex '^mkdi' | \
    sed -r 's/.*\/([^/]+)\.[^.]+\.[^.]+$/\1/'
mkdir
mkdirhier
mkdiskimage

и работает , который Имена команд тоже:

$ man --sections=1,8 --where --all --regex '^mkdi' | \
    sed -r 's/.*\/([^/]+)\.[^.]+\.[^.]+$/\1/' | xargs which 
/bin/mkdir
/usr/bin/mkdirhier
/usr/bin/mkdiskimage

Шаблоны являются регулярными выражениями, поэтому добавляют ^ , чтобы соответствовать только в начале имени.
Для синтаксиса шаблона, похожий на раковину, заменить - Regex на - Wildcard ,
вроде Человек ... --wildcard 'mkdi *' | ... .

Как функция оболочки:

whichmatch() {       
    man --sections=1,8 --where --all --regex "$@" |
        sed -r 's/.*\/([^/]+)\.[^.]+\.[^.]+$/\1/' |
        xargs which
}

Используется как:

whichmatch '^mkdi'

для приближенного сопоставления командных имен, Whileman может использоваться вместо MAN .

0
27.01.2020, 20:46

Теги

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