como posso encontrar arquivos baseados em nomes diferentes e apagar todos eles em uma única linha [duplicada]

2
    

Esta pergunta já tem uma resposta aqui:

    

Encontrando arquivos baseados em nomes diferentes que eu sei fazer. O problema é que eu não sei como deletar todos de uma só vez. Estou usando o OMVS no z / OS390.

Para encontrar arquivos pesquisando por extensões diferentes, estou fazendo com êxito:

find . -name "*.xml" -o -name "*.ipm" -type f

Para excluir arquivos depois de pesquisar por apenas um nome, estou fazendo com sucesso:

find . -name "*.xml" -type f -exec rm -iv {} \;

Bem, se eu misturei as duas ideias, só foram deletados os arquivos encontrados pelo último nome:

find . -name "*.xml" -o -name "*.ipm" -type f -exec rm -iv {} \;

Nesse caso, parece que os arquivos correspondentes ao primeiro padrão ( *.xml ) não são afetados por -exec rm .

Depois de pesquisar, achei que o problema é que eu tenho que "manter" todos os nomes encontrados antes executando o rm . Eu tentei três abordagens sem sucesso ...

Primeira tentativa:

$ find . -name "*.xml" - o -name "*.ipm" -type f -print0 | xargs -0
FSUM6372 Unknown option "-"
Usage: find directory ... expression
xargs: FSUM6001 Unknown option "-0"

Usage: xargs Ý-l#¨Ý-L #¨ Ý-irepl¨Ý-I repl¨ Ý-n#¨ Ý-tpx¨ Ý-s#¨ Ý-eeof¨Ý-E eof¨ Ýc
md Ýargs ...¨¨

Segunda tentativa:

$ find . (-name "*.xml" - o -name "*.ipm") -type f
FSUM7332 syntax error: got (, expecting Newline

Terceira tentativa:

$ find . -type f \(-name "*.xml" -o -name "*.ipm"\)
FSUM6372 Unknown option "(-name"
Usage: find directory ... expression
    
por Jim C 01.06.2016 / 00:38

2 respostas

3

Sua tentativa de parêntese não tinha espaços ao redor deles, então find viu uma opção chamada (-name e não sabia o que fazer com ela. Em vez disso, adicione espaços ao redor dos parênteses como:

find . \( -name "*.xml" -o -name "*.ipm" \) -type f -exec rm -iv {} \;

Além disso, se você tiver o GNU find , poderá usar -delete em vez do -exec rm -iv {} \;

Como Wildcard observou, como estamos fazendo um comando que pode receber uma lista de argumentos, podemos salvar alguns processos (talvez muito dependendo da frequência com que eles coincidem) usando + para finalizar -exec em vez de% código%. Com \; , o + coletará os caminhos em conjuntos e os aplicará com uma única chamada do aplicativo (aqui -exec ) em vez de chamar o aplicativo uma vez para cada caminho. Então, se você não tem ou não quer usar rm , a solução mais eficiente é fazê-lo como:

find . \( -name "*.xml" -o -name "*.ipm" \) -type f -exec rm -iv {} +
    
por 01.06.2016 / 02:41
2

O uso de parênteses funciona, mas é necessário escapá-los para que o shell não os interprete como invocações de subshell. Você pode usar barra invertida, \ (e \) ou aspas.

Se nenhum de seus arquivos tiver nomes que contenham novas linhas ou outros caracteres de controle, o que deve ser o caso, a menos que alguém tente ser desagradável, use o pipe para xargs approach, que é o mais rápido, sem o -print0 e Opções -0.

    
por 01.06.2016 / 00:46