localize os arquivos .sql e .sql.gz usando o comando find

1

Eu tenho um código de script de shell que encontra .sql.gz arquivos e os move:

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

Agora, tenho mais alguns arquivos com a extensão .sql , então como posso modificar o código acima para incluir também essa extensão de arquivo. Obrigado.

    
por Tarun 02.12.2013 / 07:42

2 respostas

3

encontrar ofertas um operador "ou" (-o):

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

O operador padrão entre as expressões é "e" (-a). Como "e" tem prioridade maior que "or", precisamos usar parens para agrupar as duas expressões "-name" para obter a lógica correta. Como os cartuchos normalmente tratam os pais especialmente, escapei deles com uma barra invertida para protegê-los.

Como alternativa, você pode usar uma expressão regular:

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

Você também deve observar que o seu pipeline de comando de localizar / ler não responderá bem aos arquivos com nomes especiais (espaços iniciais à direita do espaço, novas linhas, etc.). Veja, por exemplo, este wiki para saber como lidar com esse problema.

    
por John1024 02.12.2013 / 07:59
2

Basta usar o operador "-ou":

#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

Você pode fazer tudo com um único comando:

find $Path_Backup_Dir -type f \( -name *.sql -or -name *.sql.gz \) -exec mv -f -v {} /tmp/test2 \; >> $Path_Log_File
    
por Quentin 02.12.2013 / 08:35