Trova i file in ordine alfabetico prima di una determinata stringa


8

Se ho una directory piena di file e sottodirectory. Qual è il modo migliore per elencare solo i file regolari che cadono in ordine alfabetico prima di una determinata stringa?

Attualmente il meglio che posso fare usando bash è il seguente:

for x in `find . -maxdepth 1 -type f | sort`
do
   if [[ "$x" > './reference' ]]
   then
      break
   fi

   echo $x
done

Sento che esiste un modo più conciso per farlo, ma non sono sicuro di cosa si tratti. Qualche idea?

Risposte:


4

se hai bisogno di tutti loro

 find . -maxdepth 1 -type f | sort |  awk '$0 > "./reference"'

se hai bisogno del primo

 find . -maxdepth 1 -type f | sort |  awk '$0 > "./reference"{print;exit}'

Grazie! Una variazione su questo per ottenere tutti i file tra le variabili date sarebbe:awk '$0 >= "'"${FROM}"'" && $0 <= "'"${TILL}"'"'
Nickolay

3

Con sedesso è più conciso:

$ find -maxdepth 1 -type f | sort | sed '/^\.\/reference/,$d'

Il che significa (dopo l'ordinamento) eliminare la riga di riferimento (o maggiore) e tutte le righe che seguono all'ultima riga.

Il comando sed 'd' viene usato qui con un intervallo di indirizzi, dove '/^./reference/' è l'inizio e '$' è la fine dell'intervallo. (E '$' come indirizzo indica l'ultima riga.)



3

per esempio. script-name "$HOME" "reference"... findnon sempre genera il comando ./, come nel caso di find bin, o find /tmp. Quindi, se vuoi solo i file base-names, questo funziona.

aggiornamento: Aggiunto tolower () per consentire un confronto senza distinzione tra maiuscole e minuscole, che produce le regole di confronto alfabetiche menzionate nella domanda ...

#!/bin/bash
dir="$1"; ref="$2"
find "$dir" -maxdepth 1 -type f -printf "%f\n" | awk -v"ref=$ref" 'tolower($0) < tolower(ref)'

Basta inviarlo a sortdopo awk, se necessario, ordinato.


Questo non sembra funzionare. Ho modificato l'ultima parte dello script awk in modo $0 < refche funzioni e che funzioni, ma poiché non ci sono spazi nell'output di find, il campo $ 2 non esiste. Mi sto perdendo qualcosa?
Mike Deck,

Grazie, ho apportato una rapida modifica all'ultimo momento e ho perso quel campo (originariamente aveva due campi delimitati da \ xFF ) ... Ora, che ho dormito un po ', vedo che non lo è maneggiare correttamente la custodia . Suppongo che poiché la domanda si riferisce a una raccolta alfabetica , significa che non fa distinzione tra maiuscole e minuscole . Ho aggiornato la risposta.
Peter
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.