Как я могу «пропустить» файл?

Файл последовательно загружается с помощью wget .

Если я начну распаковывать его с cat myfile.tar.bz2 | tar -xj cat myfile.tar.bz2 | tar -xj , он может распаковываться правильно или сбой с «Неожиданным EOF», в зависимости от того, что быстрее.

Как «кататься и следовать» файлу, т. Е. Выводить содержимое файла на stdout, но не выходить из EOF, а не хранить его в этом файле и продолжать вывод новых частей данных, выходящих только в том случае, если файл закрыт и не возобновляется в течение N секунд.


Я создал скрипт cat_and_follow, основанный на ответе @ arielCo, который также заканчивает tail когда файл больше не открывается для записи.

 tail +1f file 

Я тестировал его на Ubuntu с исходным tarball LibreOffice, когда wget загружал его:

 tail +1f libreoffice-4.2.5.2.tar.xz | tar -tvJf - 

Он также работает на Solaris 10, RHEL3, AIX 5 и Busybox 1.22.1 на моем телефоне Android (используйте tail +1 -f file с Busybox).

Проблема в том, что cat не знает, что файл все еще добавляется. Как только cat встречает (текущий) конец файла, он выходит.

Вы должны сделать запись wget в трубу (или FIFO), чтобы избежать этого.

 wget -O - http://... | tar -xjf - 

Чтобы прочитать и следовать файлу с самого начала, пока он не прерывается:

 tail -fn +1 file 

Чтобы продемонстрировать это, попробуйте это (предполагая Bash с GNU Coreutils):

 (while true; do printf . >> /tmp/file; sleep 1; done)& tail -fn +1 /tmp/file # (Ctrl-C to interrupt, of course, or otherwise kill it.) kill % # Kills the while-loop. 

(Примечание: +1f упомянутый другими, интерпретируется как имя файла, по крайней мере, в команде tail GNU.)

Вышеупомянутое работает для одного файла. Конкатенация нескольких файлов не сможет отслеживать все из них детерминистически, не вися на первом. Чтобы « cat and follow », следуя только последнему файлу, можно использовать замену процесса . Вот еще одна демонстрация:

 printf file1 > /tmp/file1; printf file2 > /tmp/file2 (while true; do printf . | tee -a /tmp/file{1,2} > /dev/null; sleep 1; done)& cat /tmp/file1 <(tail -fn +1 /tmp/file2) # (Interrupt or kill it.) kill % # Kills the while-loop.