найти файлы .sql и .sql.gz с помощью команды find

У меня есть код сценария оболочки, который находит .sql.gz файлы и перемещает их:

find $Dir -type f -mtime $Time -name \*sql.gz | while read file
do
    echo "Earlier $file will be moved to different folder." >> $Path_Log_File
    mv -f $file $Path_Folder
done

Теперь у меня есть еще несколько файлов с расширением .sql, так как я могу изменить свой код выше, чтобы он также включает в себя это расширение файла. Благодаря.

1
задан 28 February 2014 в 09:36

2 ответа

find предлагает оператор «или» (-o):

find $Path_Backup_Dir -type f -mtime $Time \( -name \*sql.gz -o -name \*.sql \)

Оператор по умолчанию между выражениями - «и» (-a). Так как «и» имеет более высокий приоритет, чем «или», нам нужно использовать парены, чтобы сгруппировать два выражения «-name» вместе, чтобы получить правильную логику. Поскольку раковины обычно относятся к паренсу специально, я избежал их обратной косой черты, чтобы защитить их.

В качестве альтернативы вы можете использовать регулярное выражение:

find $Path_Backup_Dir -type f -mtime $Time -regex '.*\.(sql|sql.gz)'

Следует также отметить, что ваш конвейер команд поиска / чтения не будет хорошо реагировать на файлы со специальными именами (начальные пробелы, пробелы, так далее.). См., Например, в этой вики способы решения этой проблемы.

0
ответ дан 28 February 2014 в 09:36

Просто используйте оператор «-или»:

#Find and Move backup files older than the time constraint defined
find $Path_Backup_Dir -type f -mtime $Time \( -name *sql.gz -or -name *sql \) | while read file
do
    echo "Earlier Backup $file will be moved to archive folder." >> $Path_Log_File
    mv -f $file $Path_Mysql_Archive
done

Вы можете сделать все с помощью одной команды:

find $Path_Backup_Dir -type f \( -name *.sql -or -name *.sql.gz \) -exec mv -f -v {} /tmp/test2 \; >> $Path_Log_File
0
ответ дан 28 February 2014 в 09:36

Другие вопросы по тегам:

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