Rechercher des fichiers par ordre alphabétique avant une chaîne donnée

8

Si j'ai un répertoire plein de fichiers et de sous-répertoires. Quelle est la meilleure façon de lister uniquement les fichiers normaux qui tombent alphabétiquement devant une chaîne donnée?

Actuellement, le mieux que je puisse faire en utilisant bash est le suivant:

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

   echo $x
done

J'ai l'impression qu'il existe une façon plus concise de le faire, mais je ne sais pas trop ce que c'est. Des idées?

Mike Deck
la source

Réponses:

4

si vous en avez besoin

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

si vous avez besoin du premier

 find . -maxdepth 1 -type f | sort |  awk '$0 > "./reference"{print;exit}'
iruvar
la source
Merci! Une variation à ce sujet pour obtenir tous les fichiers entre les variables données serait:awk '$0 >= "'"${FROM}"'" && $0 <= "'"${TILL}"'"'
Nickolay
3

Avec sedc'est plus concis:

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

Ce qui signifie (après le tri) supprimer la ligne de référence (ou plus) et toutes les lignes suivant la dernière ligne.

La commande sed 'd' est utilisée ici avec une plage d'adresses, où '/^./reference/' est le début et '$' est la fin de la plage. (Et «$» comme adresse signifie la dernière ligne.)

maxschlepzig
la source
3

Réponse zsh obligatoire, en utilisant le . qualificatif glob pour sélectionner uniquement les fichiers réguliers et epour sélectionner davantage parmi les correspondances:

echo *(.e\''[[ $REPLY > reference ]]'\')
Gilles 'SO- arrête d'être méchant'
la source
3

par exemple. script-name "$HOME" "reference"... findne produit pas toujours le début ./, comme dans le cas de find bin, ou find /tmp. Donc, si vous ne voulez que les noms de base des fichiers, cela fonctionne.

mise à jour: Ajout de tolower () pour permettre une comparaison insensible à la casse, ce qui produit le classement alphabétique mentionné dans la question ...

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

Il suffit de le diriger sortaprès awk, si vous en avez besoin.

Peter.O
la source
Cela ne semble pas fonctionner. J'ai changé la dernière partie du script awk pour $0 < refqu'elle fonctionne, mais comme il n'y a pas d'espace dans la sortie de find, le champ $ 2 n'existe pas. Suis-je en train de manquer quelque chose?
Mike Deck
Merci, j'y ai fait un changement rapide au dernier moment, et j'ai raté ce champ (il avait à l'origine deux champs délimités par \ xFF ) ... Maintenant que j'ai dormi un peu, je peux voir que ce n'est pas le cas manipuler le boîtier correctement. Je suppose que comme la question fait référence à un classement alphabétique , cela signifie insensible à la casse . J'ai mis à jour la réponse.
Peter.O