#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. Спасибо. Это выглядит хорошо и должно хорошо работать. Проблема в том, что в некоторых именах файлов есть пробелы, поэтому выбирается только первое слово имени.