Как мне получить только имя файла из lsof?

#linux #bash #unix

#linux #удар #unix #bash

Вопрос:

Я хочу использовать lsof для создания списка открытых файлов в папке. Я использую macOS, но понимаю, что это обычное дело для * nix.

В man lsof кажется, что опция -Fn ближе всего к тому, что я хочу, но я не могу продвинуться дальше этого. Я пытаюсь сократить, чтобы добраться только до имени файла. Итак, это команда, которую я использую:

$ lsof -Fn dir1 | cut -c2-

Я ожидаю

 dir1/file1.txt
  

Я получаю

 32783
34
dir1/file1.txt
32785
3
dir1/.DS_Store
  

Комментарии:

1. Хорошо, что вы продемонстрировали свои усилия в своем сообщении, всегда рекомендуется публиковать образец ввода и ожидаемый результат также в вашем сообщении, чтобы получить четкое представление о вашем вопросе.

2. может быть lsof |grep -oP '/.*' должно сработать.

Ответ №1:

Не могли бы вы, пожалуйста, попробовать следующее (поскольку образцы не были опубликованы, поэтому протестированы только в моем тестовом окне).

 lsof  | awk 'match($0,//([^ ])*|/([^$])*/){print substr($0,RSTART,RLENGTH)}'
  


РЕДАКТИРОВАТЬ: Поскольку OP не нужно иметь файлы с точкой в их именах (я думаю, в основном скрытые), тогда можно попробовать следующее.

 lsof  | 
awk '
FNR>1 amp;amp; match($0,//.*/){
   val=substr($0,RSTART,RLENGTH)
   if(val !~ //./){
     print val
   }
   val=""
}'
  

Комментарии:

1. Спасибо, это помогает. Я думал, что есть способ сделать это с помощью опций в lsof. Я попробую разобраться в этом регулярном выражении. Есть ли способ исключить файлы dot?

2. @RedZebra, конечно, я тоже добавлю некоторые пояснения в свой пост через несколько минут. Связанные с точечными файлами если бы вы могли опубликовать пример, я мог бы настроить код в соответствии с этим, дайте мне знать пример.

3. Спасибо. Выводите строки, подобные этой. Обычно .DS_Store. /testing?Dir2/.DS_Store

4. @RedZebra, конечно, не могли бы вы, пожалуйста, попробовать мою команду РЕДАКТИРОВАНИЯ и сообщить мне, поскольку у меня нет никаких скрытых файлов lsof , поэтому я не смог его протестировать, дайте мне знать?

5. Хорошо, итак, я вызвал скрипт bash из perl как дочерний процесс. Все хорошо.

Ответ №2:

вы можете использовать эту команду:

 lsof your_dir | awk '{print $9}'
  

Обновить:

 lsof your_dir | awk '{for(i=9;i<=NF;  i)print $i}'
  

это приведет к печати столбца 9 до конца.

Комментарии:

1. Спасибо. Это выглядит хорошо и должно хорошо работать. Проблема в том, что в некоторых именах файлов есть пробелы, поэтому выбирается только первое слово имени.