Localizar no AIX com saída para o arquivo

1
find /apps/dynalife/clients/. ! -path "train" -type f -mtime +90 ! \( -name "*.p" -o -name "*.i" -o -name "*.w" -o -name "*.cls" -o -name "*.inf" -o -name "*.bat" \) -exec {} \; > /apps/dynalife/util/delFile.lst

Estou tentando encontrar todos os arquivos com mais de 90 dias em /apps/dynalife/clients/ e todas as subpastas. Mas excluo a subpasta /apps/dynalife/clients/train/ e também desejo excluir todos os arquivos com extensões que terminem em um dos poucos valores p / i / w / cls / inf / bat

O script está apenas produzindo um arquivo vazio.

A idéia é ter um arquivo que eu possa verificar e usar como entrada para o comando rm para remover todos os arquivos encontrados.

Localizar atualizado:

find /apps/dynalife/clients/ ! -path "*/mapwrk/*" -type f -mtime +90 ! \( -name "*.p" -o -name "*.i" -o -name "*.w" -o -name "*.cls" -o -name "*.inf" -o -name "*.bat" -o -name "*.ini" -o -name "*.pf" -o -name "*.wob" -o -name "*CIM900*" \) -print > /apps/dynalife/util/delFile.lst

Excluir atualizada:

xargs rm < /apps/dynalife/util/delFile.lst
    
por AquaAlex 09.12.2013 / 11:17

2 respostas

2

Você só passa o nome do arquivo para -exec , de modo que não faça nada. Você precisa usar -print0 para que você também possa manipular nomes de arquivos com novas linhas e outros caracteres especiais, então faça algo como:

find /apps/dynalife/clients/. ! -path "train" -type f -mtime +90 ! \( -name "*.p" -o -name "*.i" -o -name "*.w" -o -name "*.cls" -o -name "*.inf" -o -name "*.bat" \) -print0 > /apps/dynalife/util/delFile.lst

Isso fornecerá uma lista que você pode inserir em rm usando:

cat /apps/dynalife/util/delFile.lst | xargs -0 rm

Se a sua localização não suportar -print0 e seus nomes de arquivos não contiverem novas linhas (mas espaços), você poderá usar -print :

find /apps/dynalife/clients/. ! -path "train" -type f -mtime +90 ! \( -name "*.p" -o -name "*.i" -o -name "*.w" -o -name "*.cls" -o -name "*.inf" -o -name "*.bat" \) -print > /apps/dynalife/util/delFile.lst

e:

cat /apps/dynalife/util/delFile.lst | xargs rm
    
por 09.12.2013 / 11:39
2

O argumento para -path é corresponder ao caminho. -path trains nunca corresponderia a nada.

find /apps/dynalife/clients ! -path '/apps/dynalife/clients/trains/*' \
  -type f -mtime +90 ! \( -name "*.p" -o -name "*.i" -o -name "*.w" \
  -o -name "*.cls" -o -name "*.inf" -o -name "*.bat" \
  \)  > /apps/dynalife/util/delFile.lst

No entanto, se você não pretende encontrar nenhum arquivo em trains , você também pode podar para evitar que ocorra nele:

find /apps/dynalife/clients -path /apps/dynalife/clients/trains -prune -o \
  -type f -mtime +90 ! \( -name "*.p" -o -name "*.i" -o -name "*.w" \
  -o -name "*.cls" -o -name "*.inf" -o -name "*.bat" \
  \) -print > /apps/dynalife/util/delFile.lst

Supondo que nenhum dos nomes de arquivo contenha caracteres de nova linha, você pode removê-los com:

sed 's/./\&/g' < /apps/dynalife/util/delFile.lst | xargs rm -f

Aqui, estamos escapando de todos os personagens (mas de nova linha) para que eles não sejam considerados especialmente por xargs . Estritamente falando, apenas:

sed "s/[\' \"$(printf '\t')]/\\&/g"

é necessário (ou seja, apenas espaço, tabulação, barra invertida, aspas simples e duplas precisam ser ignoradas).

    
por 09.12.2013 / 13:49

Tags