número máximo de arquivos que ls podem listar [duplicados]

7

Estou usando um script para excluir um arquivo antigo em um diretório, mas o script continua mostrando

/usr/bin : Argument list too long

Descobriu-se que o número de arquivos era de 40000 e mais. Por isso, quero saber qual é o limite máximo de arquivos que podem ser listados. Existe alguma maneira de encontrá-lo? É específico do sistema?

    
por Jishnu U Nair 05.03.2014 / 10:19

4 respostas

11

Esta mensagem não é de ls , mas de exec . você pode ver o tamanho máximo da lista de argumentos executando getconf ARG_MAX .

Não são quantos arquivos podem ser manipulados pelo aplicativo, mas o tamanho dos argumentos que podem ser passados usando exec para o sistema operacional, que retorna E2BIG se o tamanho dos argumentos estiver além do aceitável intervalo.

Esse limite era tradicionalmente (até o Linux 2.6.23) conferido usando o kernel define ARG_MAX , encontrado em sys/linux/limits.h . No entanto, hoje em dia isso é específico para o ambiente que você está executando. Normalmente, o tamanho máximo dos argumentos agora pode ser tão grande quanto um quarto do tamanho da pilha do espaço do usuário.

    
por 05.03.2014 / 10:23
5

O limite varia entre sistemas operacionais e versões. O limite não é o número de arquivos, mas bytes. Você pode (normalmente) obter seu limite local assim:

$ getconf ARG_MAX
2097152

Veja também: FAQ BAS 095

    
por 05.03.2014 / 10:23
3

A situação não é a mesma se você fizer

ls /usr/bin

ou

ls /usr/bin/*

Porque no segundo caso, bash glob retorna uma lista que é passada para ls e isso é muito limitado (que é uma das razões pelas quais xargs existe). Eu até acho que o limite do shell é menor que o do exec.

    
por 05.03.2014 / 10:58
1

Eu corri para esta situação quando trabalhei com 4.2 BSD há muito tempo. Nos bastidores, o shell tem um espaço de memória no ambiente para usar para passar argumentos de linha de comando para programas chamados. Como já foi mencionado, varia de Unix para Unix, mas geralmente é um parâmetro ajustável no sistema operacional.

Expandir esse espaço no sistema aumenta o requisito de memória para todo o sistema, o que pode não ser ideal para você. O que seria útil explorar para o seu propósito é o uso da opção -exec em uma sintaxe 'find', como nesta sintaxe para encontrar e excluir recursivamente arquivos (tipo f) no diretório atual (e abaixo) que são mais antigos que 30 dias (-mtime +30):

find . -type f -mtime +30 -exec rm {} \;

É muito poderoso, e encontra-se fazendo a remoção, por isso não há limite no número de arquivos removidos. Se a sua remoção precisar corresponder aos arquivos de determinados padrões de nome, você poderá gerar isso com a localização também.

    
por 05.03.2014 / 20:01

Tags