2015-05-04 4 views
1

Как я могу найти файлы с «log. [One or more digitits of numbers]»?Найти файлы с расширениями, состоящими только из цифр

У меня есть список файлов в каталоге журнала:

/user/log/log.1 
/user/log/log.222 
/user/log/log.201505 
/user/log/log.2014.gz 

Я хочу GZIP файлы, заканчивается только с числами, а затем переместить их в папку Бака:

/user/bak/log.1.gz 
/user/bak/log.222.gz 
/user/bak/log.201505.gz 

Is там любой способ включить шаблон (журнал. [0-9] *) и исключить расширения, отличные от номеров, в то же время с использованием найти/ls/grep и т. Д.?

Кроме того, мое дело требует от меня, чтобы выполнить резервное копирование журналов выше на других серверах тоже я просто использовать

ssh $SERVER "command1;command2;..." 

, чтобы сделать работу, даже с петлями?

Спасибо.

ответ

1

Флаг -regexfind. Вам также понадобится -E, чтобы интерпретировать регулярное выражение как современное расширенное регулярное выражение. Что-то вроде этого:

find -E /user/log -regex '.*/log\.[0-9]+' 
+0

К сожалению, получается, '-E' от BSD находки. Если это сработает для вас без него, тогда отлично, иначе вы можете посмотреть [флаг -regextype] (http://www.gnu.org/software/findutils/manual/html_mono/find.html#Regular-Expressions) , –

+0

Спасибо за ваш ответ, но приведенная выше команда возвращает 'find: unknown predicate' -E''. Он работает отлично без -E. Не могли бы вы объяснить немного больше о том, что есть. */Перед входом в регулярное выражение? – haust

+0

@haust Регулярное выражение должно соответствовать всему пути, который включает префикс '/ user/log' в этом случае. '. * /' говорит, что соответствует чему-либо до последней косой черты. Вы также можете просто написать '-regex '/ user/log/log \. [0-9] +'' в этом случае. –

-1

я придумал с подобным регулярным выражением:

^.+\/log\.[0-9]+ 
0

Если вы не возражаете петлю, вот инициатива:

#!/bin/bash 
for file in /user/log/*; do 
if [[ -f $file ]]; then 
ext="${file##*.}" 
if [[ $ext =~ [0-9]$ ]]; then 
#only files with numeric extention are available here 
#put your gzip or whateve code here 
fi 
fi 
done 
+0

Поскольку я должен использовать ssh на других серверах и выполнять это действие, я хотел бы, чтобы он был простым и, если это возможно, избегал циклов. Спасибо за предоставление альтернативного решения. – haust

0

Вот один -линер, который вы можете использовать. Я тестировал для выполнения локально.

find /user/log/ -type f -name "log.*[0-9]" -exec bash -c 'gzip "{}" && mv "{}.gz" "/user/bak/"' \; 

Можно можно вызвать это с помощью SSH, как показано ниже:

ssh [email protected]$SERVER 'find /user/log/ -type f -name "log.*[0-9]" -exec bash -c 'gzip "{}" && mv "{}.gz" "/user/bak/"' \;' 
+1

Умное решение, кроме «log. * [0-9]», будет включать файлы типа «log.a123» и т. Д. Я объединил ваш код с регулярным выражением из @Ismail Badawi, и он отлично работает. 'find/user/log/-type f -regex '. */Log \. [0-9] +' -exec bash -c 'gzip" {} "&& mv" {} .gz ""/user/bak/"'\;' Спасибо! – haust

+0

Что произойдет, если нет подходящего файла, следовательно, нет файла для gz и mv? Есть ли способ перенаправить результаты (если они есть) в файл журнала? – haust

1

Использования Баша продлена модели:

shopt -s extglob 
numeric_extensions=(*.+([0-9]))   # use an array for storage 
printf "%s\n" "${numeric_extensions[@]}" # print the array contents 
Смежные вопросы