как отслеживать все файлы, кроме одного

У меня есть файлы журнала в двух каталогах, для простоты я буду называть их dir 1 и dir 2.

Допустим, пользователь вводит файл file.log, который находится в каталоге dir1, я должен указать -f все файлы из каталога dir1 и dir2, кроме file.log. Может кто-нибудь помочь мне с этим, пожалуйста.

ssh host 'find /path/to/a/log -maxdepth 1 -type f -name "file*" -name "*.log" ! -name "$1" -print0 -exec tail {} \;' > /home/pl-${node}.log

ssh host 'find /path/to/a/log -maxdepth 1 -type f -name "file*" -name "*.out" ! -name "$1" -print0 -exec tail {} \;' > /home/pl-${node}.out                                                        

node - это просто переменная, в которой хранятся 1 и 2. Когда я ввожу ./test file-1.log, вывод будет:

pl-1.log
Oct 21 09:15 pl-1.out
Oct 21 09:15 pl-2.log
Oct 21 09:15 pl-2.out                                               

Как вы видите, все файлы были отслежены, хотя я указал, что file-1.log не следует указывать в аргументе $1.


person user2864207    schedule 17.10.2013    source источник


Ответы (2)


Что-то вроде этого должно получиться:

find . -type f ! -name "*dir1/file.log" -exec tail {} \;

То есть используйте find ... -exec tail {} \;, добавляя дополнительное условие, что файл не должен называться file.log.


Обновлять

как я могу использовать find, если имя файла является аргументом в командной строке. например find. ! -type f -name "$ 1"

Вот так, например:

ssh host "find / path / to / a / log -maxdepth 1 -type f -name 'file * .log'! -name \" $ 1 \ "-print0 -exec tail {} \;" > /home/pl-${node}.out

Обратите внимание, что я использую find ".... -name \"$1\" ... ", потому что для «отправки» переменных вам нужны двойные кавычки.

person fedorqui 'SO stop harming'    schedule 17.10.2013
comment
Будет найдено все, что не является файлом с именем file.log. (Необходимо переместить!) - person William Pursell; 17.10.2013
comment
потому что я не знаю, какой файл пользователь хочет подавить, я не знаю, в каком каталоге находится файл - person user2864207; 17.10.2013
comment
Да, @WilliamPursell, этого хочет ОП. - person fedorqui 'SO stop harming'; 17.10.2013
comment
@ user2864207, тогда вместо *dir1/file.log вы можете просто написать file.log. - person fedorqui 'SO stop harming'; 17.10.2013
comment
как я могу использовать find, если имя файла является аргументом в командной строке. например find. ! -type f -name $ 1 - person user2864207; 21.10.2013
comment
Ухм, в моей машине есть. Обновите свой ответ, указав точную команду, которую вы используете, а также ввод и вывод. - person fedorqui 'SO stop harming'; 21.10.2013
comment
Обновите свой вопрос, чтобы вы могли правильно отформатировать код. В комментариях довольно сложно понять код. - person fedorqui 'SO stop harming'; 21.10.2013
comment
Хорошо, теперь я понимаю. Вы устанавливаете $1 как переменную. Вам лучше использовать такие имена, как var1, потому что $1 зарезервирован для других целей. Также проверьте stackoverflow.com/ questions / 2416880 /, потому что вы хотите, чтобы переменная работала с помощью команды ssh. - person fedorqui 'SO stop harming'; 21.10.2013
comment
Я установил var1 = $ 1 и передал $ var1 вместо $ 1, а также включил -name qsub $ var1. но это не работает. Я не знаю что мне не хватает - person user2864207; 21.10.2013

Следующие tail все файлы из dir1 и dir2, кроме file.log:

shopt -s extglob
tail -f {dir1,dir2}/!(file.log)

manual предоставляет дополнительную информацию о extglob (что позволяет сопоставление с образцом).

person devnull    schedule 17.10.2013
comment
у меня небольшой вопрос. скажем, мои файлы журналов расположены в / path / to / a / log / file, если я напишу tail -f / path / to / a / log / file, собираются ли все файлы внутри этого каталога? - person user2864207; 17.10.2013
comment
@ user2864207 Да, tail -f /path/to/a/log/!(file.log) будет отслеживать все файлы в указанном каталоге, кроме file.log - person devnull; 17.10.2013
comment
@ user2864207 Чтобы предоставить несколько каталогов, вы можете сказать tail -f {/path/to/a/log,/path/to/another/log}/!(file.log), что исключает file.log в обоих указанных каталогах. - person devnull; 17.10.2013
comment
у меня есть синтаксическая ошибка для следующей строки кода: ssh -q rt tail -n 20 {/ path / to / a / log} /! ($ 3) ›/ another / path / file 2› / dev / null &. $ 3 - это аргумент, который соответствует файлу - person user2864207; 17.10.2013
comment
это круто :) - person Andbdrew; 30.07.2018