Из-за отсутствия знаний о команде find
я просто использую менее эффективную, но, скорее всего, не менее полезную и, вероятно, более читабельную однострочную команду, которая также включает grep
:
find . -type d | grep -v "/\.git"
Он не говорит мне всего , но я использовал fuser ~ / .myfile.txt.swp
, который дал мне PID сеанса vim. Запуск ps aux | grep
Мне удалось узнать, какой сеанс vim я использую, что дало мне подсказку, в каком окне он был открыт.
Благодаря вдохновению Джайлза, его настойчивости и удаче, Я придумал следующую команду:
⚘ (FNAME="/tmp/.fnord.txt.swp"; tmux switch -t $(tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_tty}' | grep $(ps -o tty= -p $(lsof -t $FNAME))$ | awk '{ print $1 }'))
Чтобы объяснить, что это делает:
(FNAME="/tmp/.fnord.txt.swp";
Это создает подоболочку и устанавливает FNAME
в качестве переменной среды. Строго говоря, в этом нет необходимости - вы можете просто заменить $ FNAME
на имя файла самостоятельно, но это действительно упрощает редактирование. Теперь работаем изнутри:
lsof -t $FNAME
Это производит только PID процесса, открывшего файл.
ps -o tty= -p $(...)
Это дает pts
PID, который мы нашли с помощью lsof
.
tmux list-panes -a -F '#{session_name}:#{window_index}.#{pane_index} #{pane_tty}'
Это создает список панелей, содержащий записи типа session: 0.1 / dev / pts / 1
. Первая часть - это формат, который нравится tmux для целей, а вторая часть - это pts
| grep $(...)$
. Эта часть фильтрует наш список панелей - конечный $
соответствует только один , о котором мы заботимся.Я обнаружил это совершенно случайно, так как у меня было pts / 2
и pts / 22
, так что было два совпадений, упс!
| awk '{ print $1 }'
Это создает часть session: 0.1
вывода панели, которая подходит для передачи в tmux switch -t
.
Это должно работать как для сеансов, так и для панелей, фокусируя внимание на панели, содержащей ваш файл подкачки.
общий ответ на ваш вопрос::
for all the tmux sessions:
for all the windows in the session:
for all the panes in windows:
for all sub process pids (recursively):
find the open files
все сеансы :список tmux -сеансы -F ' #{сеанс _идентификатор} :#{сеанс _имя}
все окна :tmux list -windows -F ' #{window _id}XX #{window _index}XX #{window _name}' -t "$ сеанс _идентификатор"
все панели :tmux list -panes -F ' #{pane _id} :#{pane _index} :#{pane _pid}' -t ""$session _id" :"$window _индекс""
все подпроцессы pids :ps -o pid --нет -заголовков --ppid $pid
открыть файлы :lsof -p $pid
Реализация вышеуказанного, которая отображает дерево:
sessions
windows
panes
process
open files
чтобы показать, какой процесс имеет открытый файл (vim и в моем случае ).
можно найти по адресуhttps://github.com/nkh/tmux-ls
он находится на github уже 5 лет, но я призываю вас клонировать его на случай его удаления (или сбоя github)