Используя tr
ard wc
:
function countchar()
{
while IFS= read -r i; do printf "%s" "$i" | tr -dc "$1" | wc -m; done
}
Использование:
$ countchar '"' <file.txt #returns one count per line of file.txt
1
3
0
$ countchar ')' #will count parenthesis from stdin
$ countchar '0123456789' #will count numbers from stdin
Я не полагаю, что существует способ определить, какая программа создала файл.
Для Вашего альтернативного вопроса: можно наблюдать за файлом, который будет воссоздан, тем не менее, с помощью inotify
. inotifywait
интерфейс командной строки для inotify
подсистема; можно сказать этому искать create
события в Вашем корневом каталоге:
$ (sleep 5; touch ~/making-a-test-file) &
[1] 22526
$ inotifywait -e create ~/
Setting up watches.
Watches established.
/home/mmrozek/ CREATE making-a-test-file
Вы, вероятно, хотите выполнить его с -m
(монитор), который говорит этому не выходить после того, как это будет видеть первое событие
Можно наблюдать все, что происходит в файловой системе путем доступа к нему по LoggedFS. Это - сложенная файловая система, которая регистрирует каждый доступ в дереве каталогов.
loggedfs -l /var/tmp/$USER-home-fs.log ~
Вход Вашего целого корневого каталога мог бы замедлить Вашу систему все же. Вы, по крайней мере, захотите записать конфигурационный файл со строгими фильтрами.
Если у Вас есть корневой доступ на Linux, можно использовать контрольную подсистему для входа большого количества вещей, включая доступы к файловой системе. Удостоверьтесь auditd
демон запускается, затем настройте то, с чем Вы хотите зарегистрироваться auditctl
. Каждая зарегистрированная операция зарегистрирована в /var/log/audit/audit.log
(на типичных дистрибутивах). Начинать наблюдать конкретный файл:
auditctl -w /path/to/file
или в подробной форме
auditctl -a exit,always -F path=/path/to/file
Если Вы помещаете часы в каталог (с -w
или -F dir=
), за файлами в нем и его подкаталогах рекурсивно также наблюдают.
Вы могли бы хотеть смотреть на auditd
, этот пакет позволяет Вам делать аудит безопасности и получать большую информацию о том, кто изменился что в файловой системе.
Вы не имеете inotify
таким образом, можно записать сценарий, который проверяет на файл в цикле:
#!/bin/sh
while [ true ]; do # Run for as long as nessesary
if [ -f /path/to/file ]; then # If fileexists
echo "Found file" # Notify and stop monitoring
exit 0
fi
sleep 5 # Else wait 5 secs
done
Я знаю, что это старый вопрос, но я предложу другой подход на тот случай, если кто-то сочтет его полезным. Первоначально я разместил это как ответ на вопрос, который был обманут на этот.
Одним из вариантов является использованиеsysdig
:открытого -приложения для мониторинга системы. Используя его, вы можете отслеживать активность файла по имени. Предположим, вы хотите увидеть, какой процесс создает файл с именем/tmp/example.txt
:
# sysdig fd.name=/tmp/example.txt
567335 16:18:39.654437223 0 touch (5470) < openat fd=3(<f>/tmp/example.txt) dirfd=-100(AT_FDCWD) name=/tmp/example.txt flags=70(O_NONBLOCK|O_CREAT|O_WRONLY) mode=0666
567336 16:18:39.654438248 0 touch (5470) > dup fd=3(<f>/tmp/example.txt)
567337 16:18:39.654438592 0 touch (5470) < dup res=0(<f>/tmp/example.txt)
567338 16:18:39.654439629 0 touch (5470) > close fd=3(<f>/tmp/example.txt)
567339 16:18:39.654439764 0 touch (5470) < close res=0
567342 16:18:39.654441958 0 touch (5470) > close fd=0(<f>/tmp/example.txt)
567343 16:18:39.654442111 0 touch (5470) < close res=0
Из этого вывода видно, что процесс с именем touch
и pid 5470 открыл файл.
Если вам нужна дополнительная информация, вы можете запустить «режим захвата», в котором собирается трассировка системных вызовов:
# sysdig -w /tmp/dumpfile.scap
Затем дождитесь создания файла, затем остановите sysdig
и запустите:
# csysdig -r /tmp/dumpfile.scap
Это позволит вам изучить все, что произошло. Вы можете нажать <F2>
и выбрать Files
, нажать <F4>
, чтобы найти имя файла, затем нажать <F6>
, чтобы «копать» (, что покажет вам вывод, аналогичный приведенной выше команде ). При этом вы можете использовать тот же подход для поиска информации о процессе, который фактически создал файл.
Существует версия csysdig
с графическим интерфейсом под названием sysdig-inspect
, если она вам больше нравится.
Вы можете использовать систему аудита Linux для получения информации и событий, происходящих с файлами.
touch hello.txt
sudo auditd
sudo auditctl -w $PWD/hello.txt -p warx -k hello-file
echo 'hello world' > hello.txt
sudo ausearch -k hello-file
inotify
? Это не установило (ядро 2.6.34) и существует нет/dev/inotify
. – Wolf 18.01.2011, 21:52CONFIG_INOTIFY_USER
(Filesystems
->Inotify support for userspace
).inotifywait
находится, вероятно, в пакете, названном чем-то какinotify-tools
– Michael Mrozek♦ 18.01.2011, 22:01inotify-tools
пакет, таким образом, я теперь имеюinotifywait
(иinotifywatch
). Я проверил его, и это, кажется, работает. – Wolf 18.01.2011, 22:46