ordem de classificação padrão do comando find


30

qual é a ordem de classificação padrão para as entradas retornadas pelo comando linux find?

Por exemplo, se eu emitir

find . -type f -name '*mp3' 

e a saída consiste em vários arquivos em várias subpastas, qual é a ordem padrão em que os diretórios estão listados? Ao mesmo tempo, qual é a ordem de classificação na qual os arquivos em um diretório individual são listados?

Às vezes retorna:

./B/01.mp3
./A/01.mp3
./A/04.mp3
./A/02.mp3

Veja como primeiro o conteúdo do diretório B é listado, depois o do diretório A. Ao mesmo tempo, no diretório A, os arquivos são listados em uma ordem engraçada.


Por experiência, parece ser consistente por instalação, ou seja. se você tiver o mesmo conjunto de arquivos em duas máquinas, ele sempre retornará um pedido em uma máquina e outro completamente diferente na outra. Eu me perguntei por que antes, +1
James L

11
Eu tenho um transmissor de FM no meu carro e ele sempre toca músicas do meu cartão de memória em uma ordem estranha. Eu nunca percebi isso, mas eu reconheci que era exatamente a mesma ordem em que o comando acima retornou a sua saída
Nasko

BTW: a localização do BSD possui um -sparâmetro para classificar alfabeticamente a saída.
lapo 2/12/2015

Respostas:


19

findpercorrerá a árvore de diretórios na ordem em que os itens são armazenados nas entradas do diretório. Isso (principalmente) será consistente de execução para execução, na mesma máquina e será essencialmente "ordem de criação de arquivos / diretórios" se não houver exclusões.

No entanto, alguns sistemas de arquivos solicitarão novamente as entradas do diretório como parte das operações de compactação ou quando o tamanho da entrada precisar ser expandido, portanto, sempre haverá uma pequena chance de a ordem "bruta" mudar ao longo do tempo. Se você deseja um pedido consistente, alimente a saída através de um estágio de classificação extra.


Obrigado pela sua resposta detalhada! Portanto, se meu transmissor de FM (veja meu comentário anterior) reproduzir faixas na ordem em que o comando find as listaria, não poderei controlar em que ordem gostaria que elas fossem reproduzidas.
Nasko

Bem, o cartão flash provavelmente usa um sistema de arquivos FAT e, se bem me lembro, manipular a ordem das entradas do FAT é bastante fácil com um depurador do sistema de arquivos. Talvez valha a pena copiar as músicas do flash atual para um novo flash, na ordem em que você deseja que sejam reproduzidas, que seja mais fácil.
Vatine 17/09/10

Uma das aplicações úteis dessa consistência é uma estimativa do progresso de find /path/ -exec ...execução lenta, com muito mais rapidez, find /path/para obter primeiro a lista classificada de arquivos.
Andrey

6

Você não deve confiar em uma ordem de saída específica finde deve usar sortoutros meios para controlar especificamente a ordem.


2

Trabalho no UNIX / Linux desde 1984/1991, respectivamente, e o primeiro comando que aprendi foi encontrar. O Linux / GNU colocou praticamente tudo o que você precisa no comando find atual, para brincar com ele.

Aqui estão algumas dicas úteis para classificar a saída de localização. A opção -printf oferece várias opções para ativar a classificação mais complexa e a apresentação de informações do arquivo. É o melhor para problemas como este. Brinque com ele para ver o que funcionará para você. Usando -printf, você pode personalizar e delimitar os resultados da maneira que desejar. Isso ajuda bastante quando você precisa postar os resultados do processo. Espero que isso ajude alguém.

  1. Se você usar -ls e quiser classificar por nome do arquivo, o 11º campo será o nome do arquivo, para que você possa fazer o seguinte. A opção sort -k também pode usar vários campos para classificar.

    encontre / caminho -ls | ordenar -k11

  2. Se você deseja um controle de granulação mais fina por ordem de data / hora em ordem crescente ou decrescente, use a opção -printf "". Consulte o manual para obter mais detalhes, mas a seguir é apresentado um exemplo que será impresso com segundos fracionários, para que seja muito preciso.

EXEMPLO DATA / HORA: 17-09-2016 + 12: 09: 57.9013929800

find /path -printf "%T+ %p\n" | sort -n # Ascending

find /path -printf "%T+ %p\n" | sort -nr # Descending

Outra maneira de fazer isso sem caracteres na cadeia de data / hora é.

EXEMPLO DATA / HORA: 20160917120013.8101685040

find /path -printf "%AY%Am%Ad%AH%AM%AS %p\n" | sort -n
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.