Используйте этот сценарий 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
.
В zsh:
echo $path/mkdi*(N)
В других оболочках, для потребления человеком:
set -f; IFS=:
for x in $PATH; do set +f; ls $x/mkdi* 2>/dev/null; done
locate mkdi
Обновление: это ограничит вывод файлами в $PATH
locate mkdi |
while read filename; do
[[ ":$PATH:" == *:$(dirname $filename):* ]] && echo $filename
done
locate
ищет целую файловую систему на основе базы данных, в отличие от этого which
который ищет файлы в $PATH согласно текущему состоянию.
– Philomath
20.07.2011, 21:59
which
.
– Caleb
20.07.2011, 22:55
locate bin/mkdi
. Однако, это смотрит в общедоступных частях файловой системы (или безотносительно updatedb
индексы), без рассмотрения $PATH
.
– Gilles 'SO- stop being evil'
21.07.2011, 00:27
-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
Если Вы не уверены в исполняемом файле, Вы ищете, можно также запросить man
база данных с apropos
команда, например apropos dir
перечислит команды, наиболее часто используемые при работе с каталогами, найти команду, которой Вы нуждаетесь, передаете его which
как нормальный.
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
... который может быть ближе к тому, что Вы ищете.
Вот еще один способ получить двоичный путь (если префикс известен) при помощи 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
Следующий подход перечисляет все полные пути к подобранным двоичным файлам с помощью только 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
, поскольку вы ищете команды, вместо того, чтобы соответствовать именам двоичных файлов команд, вы могли бы сопоставить имена страниц человека как альтернативы; Это может иметь смысл, потому что 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
.