trova l'ordine di ordinamento predefinito del comando


30

qual è l'ordine di ordinamento predefinito per le voci restituite dal comando find di linux?

Ad esempio, se problema

find . -type f -name '*mp3' 

e l'output è costituito da più file in più sottocartelle, qual è l'ordine predefinito in cui sono elencate le directory? Allo stesso tempo, qual è l'ordinamento in cui sono elencati i file all'interno di una singola directory?

A volte ritorna:

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

Guarda come viene elencato prima il contenuto della directory B, quindi quello della directory A. Allo stesso tempo all'interno della directory A, i file sono elencati in un ordine divertente.


Dall'esperienza sembra essere coerente per installazione, ad es. se si dispone dello stesso set di file su due macchine, verrà sempre restituito un ordine su una macchina e uno completamente diverso sull'altra. Mi chiedevo perché prima, +1
James L

1
Ho un trasmettitore FM nella mia auto e suona sempre i brani della mia scheda flash in ordine strano. Non l'ho mai immaginato, ma ho riconosciuto che era esattamente nello stesso ordine in cui il comando sopra restituiva il suo output
Nasko,

A proposito: BSD find ha un -sparametro per ordinare alfabeticamente l'output.
lapo,

Risposte:


19

findattraverserà l'albero delle directory nell'ordine in cui gli elementi sono memorizzati nelle voci della directory. Questo sarà (principalmente) coerente da una corsa all'altra, sulla stessa macchina e sarà essenzialmente "ordine di creazione di file / directory" se non ci sono state cancellazioni.

Tuttavia, alcuni file system riordinano le voci della directory come parte delle operazioni di compattazione o quando è necessario espandere le dimensioni della voce, quindi c'è sempre una piccola possibilità che l'ordine "grezzo" cambi nel tempo. Se si desidera un ordine coerente, alimentare l'output attraverso una fase di ordinamento aggiuntiva.


Grazie per la tua risposta dettagliata! Quindi, se il mio trasmettitore FM (vedi il mio commento precedente) riproduce i brani nell'ordine in cui il comando find li elenca, non sono in grado di controllare in quale ordine mi piacerebbe che fossero riprodotti.
Nasko,

Bene, la scheda flash probabilmente utilizza un file system FAT e, se ricordo bene, manipolare l'ordine delle voci FAT è piuttosto semplice con un debugger del file system. Potrebbe valere la pena copiare i brani dal flash corrente su un nuovo flash, nell'ordine in cui si desidera che vengano riprodotti, potrebbe essere più semplice.
Vatine,

Una delle applicazioni utili di tale coerenza è una stima dello stato di avanzamento lento find /path/ -exec ...con l'esecuzione molto più veloce find /path/per ottenere prima un elenco ordinato di file.
Andrey,

6

Non dovresti fare affidamento su un particolare ordine di output da finde invece dovresti utilizzare sorte altri mezzi per controllare specificamente l'ordine.


2

Lavoro in UNIX / Linux rispettivamente dal 1984/1991 e il primo comando che mi è stato insegnato è stato find. Linux / GNU ha inserito praticamente tutto ciò di cui hai bisogno nell'attuale comando find, quindi prova a usarlo.

Ecco alcuni suggerimenti utili per l'ordinamento dell'output di ricerca. L'opzione -printf offre molte opzioni per abilitare l'ordinamento più complesso e la presentazione delle informazioni sui file. È il migliore per problemi come questo. Gioca con esso per vedere cosa funzionerà per te. Usando -printf è possibile personalizzare e delimitare i risultati nel modo desiderato. Questo aiuta parecchio quando è necessario pubblicare i risultati. Spero che questo aiuti qualcuno.

  1. Se si utilizza -ls e si desidera ordinare in base al nome del file, l'undicesimo campo è il nome del file, quindi è possibile effettuare le seguenti operazioni. L'opzione sort -k può richiedere anche più campi per ordinare.

    find / path -ls | ordina -k11

  2. Se si desidera un controllo più accurato dei grani per data / ora in ordine crescente o decrescente, utilizzare l'opzione -printf "". Vedere il manuale per maggiori dettagli, ma il seguente è un esempio che verrà stampato con secondi frazionati, quindi è molto preciso.

DATA / ORA ESEMPIO: 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

Un altro modo per farlo senza caratteri nella stringa data / ora è.

DATA / ORA ESEMPIO: 20160917120013.8101685040

find /path -printf "%AY%Am%Ad%AH%AM%AS %p\n" | sort -n
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.