Переименование файлов в соответствии с inode

Отказ от буферизации.

Во-первых, возможна буферизация; по умолчанию вывод в not-terminal-not-standard-error буферизируется по блокам (согласно setvbuf (3) ), поэтому не следует ожидать появления каких-либо журналов до тех пор, пока буфер не будет заполнен (или вообще не будет, когда что-то вылетает или съедает фатальный сигнал). Это лучше всего протестировать с двумя терминалами, один для выполнения команд, а другой для tail -f выходной файл:

# terminal watcher (how do the log lines appear in the logfile?)
rm logf; touch logf; tail -f logf

# terminal test commands (feed logfile)
php -r 'while(1){echo "logline\n";sleep(1);}' >> logf
...
^C
perl -E 'while(1){say "logline";sleep 1}' >> logf
...
^C

Из этого видно (по крайней мере, в моей системе), что PHP не блокирует выход стандартного буфера, отклонение от дефолта; однако head выполняет буферизацию, а stdbuf не помогает, так как все строки журнала появляются в сгустке:

php -r 'while(1){echo "logline\n";sleep(1);}' | head -7 >> logf
php -r 'while(1){echo "logline\n";sleep(1);}' | stdbuf -o 0 -- head -7 >> logf

Итак, head , вероятно, неправильный инструмент для этой задачи. (Кстати, различные приложения будут буферизоваться внутри, поэтому любые ужасные действия stdbuf могут не помочь:

stdbuf -o 0 perl -E 'while(1){say "logline";sleep 1}' >> logf
perl -E 'STDOUT->autoflush;while(1){say "logline";sleep 1}' >> logf

Если это вообще возможно, установите соответствующую буферизацию в самом приложении.)

Что касается журналов

Жесткое ограничение на количество строк журнала потребует чего-то, что потребляет N строк, но затем остается открытым (или приложение затем будет убито, или ...?):

php -r 'while(1){echo "logline\n";sleep(1);}' 2>&1 \
| perl -ne 'BEGIN{STDOUT->autoflush; $N=7 } if($N>0){print;$N--}' >> logf

Или это можно было бы сделать внутренне с помощью PHP, предполагая, что все журналы могут быть маршрутизированы через функцию для обработки этой задачи или модуль или фреймворк ведения журнала. В противном случае есть набор инструментов, которые регистрируют ротацию стандартных , с различными уровнями опций и задействованных кривых обучения, хотя в них, похоже, не хватает «N строк» ​​и вместо этого устанавливаются ограничения в зависимости от размера.

2
27.01.2017, 01:51
1 ответ

Помимо жестких ссылок, индексный дескриптор файла гарантированно уникален в пределах одной файловой системы. Перебор файлов .JPG в текущем каталоге и переименование ( mv -ing) с помощью stat для получения inode:

for i in *.JPG; do echo mv -- "$i" "$(stat -c '%i' "$i")"; done

echo выдаст команду mv , которая будет запущена. Удалите echo для фактического действия:

for i in *.JPG; do mv -- "$i" "$(stat -c '%i' "$i")"; done

Кроме того, если вы хотите, чтобы окончательные имена файлов также имели расширение .JPG :

for i in *.JPG; do mv -- "$i" "$(stat -c '%i' "$i").JPG"; done
2
27.01.2020, 22:10

Теги

Похожие вопросы