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.

Nasko
fonte
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.

Vatine
fonte
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.

Pausado até novo aviso.
fonte
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
David Conger-Eldeen
fonte