Comando Find - lista de argumentos muito longa

0

Oracle Linux 5.10
Escudo BASH

[oracle@src01]$ getconf ARG_MAX
131072

[oracle@srv01]$ ls -1 | wc -l
40496

#!/bin/bash
#
# delete files in /imr_report_repo that are older than 15-days
find /imr_report_repo/* -maxdepth 0 -type f -mtime +15 |
while read file
do
    rm -f $file 
done

/usr/bin/find: Argument list too long

Se eu estou lendo este direito, o máximo de argumentos permitido é 131.072 e eu tenho apenas 40.496 arquivos neste diretório. Eu não verifiquei, mas provavelmente estou tentando excluir 40.000 arquivos (com mais de 2 semanas de idade).

    
por Stringer 02.03.2016 / 21:50

3 respostas

2

O comprimento máximo da linha de comando é o tamanho total em bytes, não o número de argumentos. Arquivos 40k com nomes no formato /imr_report_repo/* significam um mínimo de 800kB, provavelmente mais. Isso está acima do limite.

A solução óbvia é fazer com que find faça a recursão para você. Vá da profundidade 1 à profundidade 1 em vez da profundidade 0 à profundidade 0.

find /imr_report_repo/ -mindepth 1 -maxdepth 1 -type f -mtime +15 -delete

Ao contrário do original, isso inclui arquivos cujo nome começa com . (arquivos de ponto). Se você não quiser, exclua-os:

find /imr_report_repo/ -mindepth 1 -maxdepth 1 -name '.*' -prune -o -type f -mtime +15 -delete

A maioria das implementações find que têm -maxdepth também têm -delete . Se o seu não, não apenas canalize o resultado em while read : é um pouco lento e quebra em nomes de arquivos contendo novas linhas (e barras invertidas e espaços em branco à direita porque você usou read onde você should usou IFS= read -r ). Use -exec , é para isso.

find /imr_report_repo/ -mindepth 1 -maxdepth 1 -type f -mtime +15 -exec rm -f {} +
    
por 03.03.2016 / 01:23
2

Acho que isso foi respondido aqui:

link

O shell está fazendo uma expansão de arquivo de / imr_report_repo / *, o que causa o problema. Eu tive um problema semelhante que consertei alterando o comando find de

find /imr_report_repo/* -maxdepth 0 -type f -mtime +15 

para

find /imr_report_repo/ -name "*" -maxdepth 0 -type f -mtime +15 

As aspas impedem que o shell expanda o curinga e, em seguida, o find pode usá-lo como uma expressão regular. Também ajuda se você precisar procurar por um grande número de arquivos que correspondam a um critério específico (como "* .foo").

    
por 03.02.2018 / 21:19
0

Tente: find /imr_report_repo/ -maxdepth 1 -type f -mtime +15 -exec rm {} + ou, como sugerido por @Fiximan, find /imr_report_repo/ -maxdepth 1 -type f -mtime +15 -delete

Se você estiver tentando excluir arquivos em subdiretórios imediatos de / imr_report_repo / (mas não / imr_report_repo em si), use find /imr_report_repo/*/ -maxdepth 0 -type f -mtime +15 -exec rm {} + (ou ... -delete ) - observe o /

observe também que isso também está sujeito ao limite ARG_MAX de 128Kbytes.

    
por 03.03.2016 / 01:21