2015-12-02 7 views
1

Я имею список файлов в директории, как показано ниже,хвост динамически создаваемые файлы в Linux

file1 
file2 
file3 
.... 
.... 

файлы будут создаваться динамически с помощью процесса.

теперь, когда я делать tail -f file* > data.txt,

файл * принимает только существующие файлы в каталоге.

для (например)

существующих файлов:

file1 
file2 

я сделать: tail -f file* > data.txt

когда хвост в процессе новый файл с именем file3 получил создан,

(здесь я должен включать в себя file3, а в хвосте без перезапуска команды)

однако мне нужно остановить хвост и запустить его снова, так что динамически создаваемые файлы и хвостов.

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

+0

Вы всегда можете записать исходный список файлов в файл * temp *, обработать файлы с помощью 'tail' и т. Д., А затем сравнить существующие файлы с файлами в * temp *. В противном случае обновите свой * temp * файл и добавьте новые созданные файлы на ваш вывод. –

ответ

1

У меня есть anwser, который удовлетворяет большинство, но не все ваших требований:

Вы можете использовать

tail -f --follow=name --retry file1 file2 file3 > data.txt 

Это будет держать открытие файлов 1.2.3, пока они не станут доступными. Он будет печатать вывод, даже если он исчезнет и снова появится снова.

Пример использования:

первые создают две фиктивные файлы:

echo a >> file1 
echo b >> file2 

теперь используют хвост (в отдельном окне):

tail -f --follow=name --retry file1 file2 file3 > data.txt 

Теперь добавьте некоторые данные и сделать некоторые другие манипуляции:

echo b >> file2 
echo c >> file3 
rm file1 
echo a >> file1 

Теперь это окончательный результат. Отметим, что все три файла будут приняты во внимание, несмотря на то, что они не присутствовали в определенный момент:

==> file1 <== 
a 

==> file2 <== 
b 
tail: cannot open ‘file3’ for reading: No such file or directory 

==> file2 <== 
b 
tail: ‘file3’ has become accessible 

==> file3 <== 
c 
tail: ‘file1’ has become inaccessible: No such file or directory 

==> file1 <== 
a 

замечание: это не будет работать с file*, потому что это шаблон Glob, который расширяется перед исполнением.Предположим, вы:

tail -f file* 

и только файлы1 и file2 присутствуют; то tail получает в качестве входных данных:

tail -f file1 file2 

Расширение Glob не может знать, какие файлы в конечном итоге соответствовать шаблону. Итак, это частичный ответ: если вы знаете все возможные имена файлов, которые будут созданы; это сделает трюк.

+0

+1 для ответа. В моем случае он продолжает создавать файл , пока процесс не завершится, поэтому я не смогу предсказать имена файлов. – user3164187

+0

Я так и предполагал, поэтому я заметил, что это, вероятно, был лишь частичным ответом. Проблема в том, что он никогда не будет работать с шаблоном glob 'file *', потому что он расширяется после выполнения ... может быть, когда что-то скриптирует? –

1

Вы можете использовать inotifywait, чтобы сообщить вам о любых файлах, созданных в каталоге. Прочитайте вывод и запустите новый tail -f в качестве фонового процесса для каждого созданного нового файла.