Je voudrais utiliser la ls
commande pour afficher d’abord les répertoires, puis les fichiers. J'ai essayé:
ls -la | sort -k 1
Mais j'ai un mauvais ordre.
ls -lh --group-directories-first
Je voudrais utiliser la ls
commande pour afficher d’abord les répertoires, puis les fichiers. J'ai essayé:
ls -la | sort -k 1
Mais j'ai un mauvais ordre.
ls -lh --group-directories-first
Réponses:
La commande suivante listera les répertoires en premier, les fichiers ordinaires en second et les liens en troisième.
ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep "^l"
En outre, il serait très judicieux de créer un alias pour cette commande afin de sauvegarder les frappes au clavier.
Modifier:
Si vous voulez d'abord les répertoires, puis tout ce qui n'est pas un répertoire, utilisez ceci:
ls -la | grep "^d" && ls -la | grep -v "^d"
ls -la | grep "^d" && ls -la | grep "^-" && ls -la | grep -v -E "^d|^-|^total"
?
alias la="ls -la | grep \"^d\" && ls -la | grep \"^-\" && ls -la | grep -E \"^d|^-\" -v | grep -v \"^total\""
ls -la|grep ^d;ls -la|grep -v ^d
(les guillemets ne sont pas obligatoires et sont remplacés &&
par ;
). Une autre option consiste à introduire une variable puis l' évaluer: a="ls -la|grep ^d";eval $a;eval $a -v
. Pourrait être utile pour éviter les répétitions lorsque beaucoup plus d'options sont spécifiées pour ls
/ grep
. Il y a aussi cette ls -la --group-directories-first
option, mais le plus court imo estls -la|sort
J'aime tellement * nix et j'adore voir l'inventivité qui entre dans certaines de ces réponses ...
Le mien n’est pas aussi sophistiqué sous GNU Linux:
alias ls='ls --color -h --group-directories-first'
Étant donné que je suis plus à l'aise avec mes applications linux CLI, j'ai également tendance à mettre à jour coreutils sur OSX:
brew install coreutils
alias ls='/usr/local/bin/gls --color -h --group-directories-first'
brew install bash
alors, cela fonctionnera! :)
Pour les utilisateurs de Mac coreutils :
brew install coreutils
alias ls='ls --color -h --group-directories-first'
En supposant que votre système soit prêt à l' homebrew :
gls
plutôt. Droite?
PATH="/usr/local/opt/coreutils/libexec/gnubin:$PATH"
.
Il y a certaines choses que je veux voir dans une liste de répertoires, et jusqu'à présent, aucune des réponses ici ne répond à toutes les exigences ci-dessous. Mes exigences pour une liste de répertoires:
./
et ../
), de fichiers et de liens.--group-directories-first
que ne fonctionnent pas dans Git Bash pour WindowsAprès de longues discussions, j'ai finalement trouvé un one-liner (bien que très long ;-)) dont je suis satisfait. J'ai assigné ceci à un alias nommé 'dir':
ls -dlF --color * .* | head -n2 && ls -AlF | LC_ALL=C grep "^d" |
LC_ALL=C sort -k 9df && ls -AlF | LC_ALL=C grep "^[l-]" |
LC_ALL=C sort -k 9df && echo -e `find -maxdepth 1 -type d ! -name . |
wc -l` Dir\(s\) `du -hs | cut -f 1`\\t\\t`find -maxdepth 1 -type f |
wc -l` File\(s\) `find -maxdepth 1 -type f -print0 | du -ch --files0-from=- |
tail -n 1 | cut -f 1`\\t\\t`find -maxdepth 1 -type l | wc -l` Link\(s\)
Pour rendre les choses plus faciles à gérer, j'ai créé des commandes distinctes pour extraire chaque segment de la liste de répertoires à mon goût, puis je les ai assemblées à l'aide de l' &&
opérateur.
ls -dlF --color * .* | head -n2
- Extrait ./
et ../
. Nous ne voulons pas les passer, sort
car ils sont déjà dans le bon ordre, et leur tri peut avoir pour conséquence de ../
commencer par être répertoriés. L' -d
option consiste à supprimer la ligne "totale"; J'aime ajouter -F
pour afficher la barre oblique de fin pour les répertoires (il marquera également les liens symboliques avec "@" lorsque vous faites un simple ls -F
).
ls -AlF | LC_ALL=C grep "^d" | LC_ALL=C sort -k 9df
- Extrayez les répertoires et triez-les par nom de fichier (9ème colonne), en ignorant les caractères non-alpha / space ( d
option) et la casse des caractères ( f
option). L' ls -A
option exclut ./
et ../
de la liste puisque nous les avons déjà extraites à l'étape précédente. J'ai tendance à préfixer tout grep
et les sort
commandes avec les LC_ALL=C
paramètres régionaux réinitialisés pour que (1) la sortie soit cohérente sur les shells Unix, et (2) vous obtiendrez parfois des performances plus rapides car le surcoût du lourd jeu de caractères UTF-8 ne traiter avec.
ls -AlF | LC_ALL=C grep "^[l-]" | LC_ALL=C sort -k 9df
- Ceci est similaire à l'étape ci-dessus, mais cette fois, nous trions des fichiers et des liens symboliques.
find -maxdepth 1 -type d ! -name . | wc -l
- Obtenir le nombre de répertoires, à l'exclusion de ./
et ../
.
find -maxdepth 1 -type f | wc -l
- Récupère le nombre de fichiers.
find -maxdepth 1 -type l | wc -l
- Obtenez le nombre de liens symboliques.
du -hs | cut -f 1
- Extraire la taille totale de tous les sous-répertoires dans un format lisible par l'homme.
find -maxdepth 1 -type f -print0 | du -ch --files0-from=- | tail -n 1 | cut -f 1
- Extrayez la taille totale de tous les fichiers dans un format lisible par l'homme.
Voyons notre nouvel dir
alias en action!
AVANT:
$ ls -alF
total 22
drwxr-xr-x 13 Tom Administ 4096 Oct 25 02:38 ./
drwxr-xr-x 3 Tom Administ 0 Dec 24 2014 ../
drwxr-xr-x 15 Tom Administ 4096 Sep 17 01:23 .VirtualBox/
-rw-r--r-- 1 Tom Administ 615 Oct 25 02:38 .aliases
-rw-r--r-- 1 Tom Administ 12742 Oct 24 11:47 .bash_history
-rw-r--r-- 1 Tom Administ 3234 Oct 24 15:06 .bash_profile
drwxr-xr-x 1 Tom Administ 0 Jan 24 2015 .gem/
-rw-r--r-- 1 Tom Administ 586 Oct 24 03:53 .gitconfig
drwxr-xr-x 1 Tom Administ 4096 Dec 28 2014 .ssh/
drwxr-xr-x 4 Tom Administ 0 Jan 24 2015 .travis/
-rw-r--r-- 1 Tom Administ 6645 Oct 25 02:38 _viminfo
-rw-r--r-- 1 Tom Administ 4907 Oct 24 15:16 profile
drwxr-xr-x 1 Tom Administ 0 Oct 24 22:20 tmp/
APRÈS:
$ dir
drwxr-xr-x 13 Tom Administ 4096 Oct 25 02:38 ./
drwxr-xr-x 3 Tom Administ 0 Dec 24 2014 ../
drwxr-xr-x 1 Tom Administ 0 Jan 24 2015 .gem/
drwxr-xr-x 1 Tom Administ 4096 Dec 28 2014 .ssh/
drwxr-xr-x 1 Tom Administ 0 Oct 24 22:20 tmp/
drwxr-xr-x 4 Tom Administ 0 Jan 24 2015 .travis/
drwxr-xr-x 15 Tom Administ 4096 Sep 17 01:23 .VirtualBox/
-rw-r--r-- 1 Tom Administ 615 Oct 25 02:38 .aliases
-rw-r--r-- 1 Tom Administ 12742 Oct 24 11:47 .bash_history
-rw-r--r-- 1 Tom Administ 3234 Oct 24 15:06 .bash_profile
-rw-r--r-- 1 Tom Administ 586 Oct 24 03:53 .gitconfig
-rw-r--r-- 1 Tom Administ 4907 Oct 24 15:16 profile
-rw-r--r-- 1 Tom Administ 6645 Oct 25 02:38 _viminfo
5 Dir(s) 2.8M 6 File(s) 31K 0 Link(s)
Un inconvénient mineur est que vous ne pouvez pas avoir de listes colorées, car les caractères de contrôle de la couleur entourant les noms de fichiers rendent le tri trop peu fiable.
MISE À JOUR
L'alias ci-dessus était extrêmement lent à l'exécution du répertoire racine d'un système de fichiers profond. J'ai donc mis à jour cette commande plus simple mais beaucoup plus performante:
ls -AFoqv --color --group-directories-first | tail -n +2 && find -maxdepth 1 -type f -printf '%s\n' | awk '{total+=$1} END {print total" bytes"}'
Exemple de sortie:
$ dir
drwxr-xr-x 1 Tom 0 Mar 29 13:49 .aws/
drwxr-xr-x 1 Tom 0 Mar 29 13:49 .gem/
drwxr-xr-x 1 Tom 0 Mar 29 19:32 .ssh/
drwxr-xr-x 1 Tom 0 Mar 29 13:49 .zbstudio/
drwxr-xr-x 1 Tom 0 Jun 16 2016 temp/
drwxr-xr-x 1 Tom 0 Jul 13 2016 vimfiles/
-rw-r--r-- 2 Tom 365 Mar 30 10:37 .aliases
-rw-r--r-- 1 Tom 16028 Mar 30 12:12 .bash_history
-rw-r--r-- 2 Tom 2807 Mar 30 12:12 .bash_profile
-rw-r--r-- 2 Tom 2177 Mar 29 23:24 .functions
-rw-r--r-- 1 Tom 1091 Mar 30 10:34 .gitconfig
-rw-r--r-- 1 Tom 8907 Mar 29 14:45 _viminfo
-rw-r--r-- 1 Tom 2444 Jul 13 2016 _vimrc
33819 bytes
Depuis la prise en charge de la nouvelle version de Git Bash pour Windows --group-directories-first
, nous n’avons plus à nous en remettre sort
. Même si le nouvel alias n'affiche pas autant d'informations que l'ancien, les gains de performances en valent la peine. En tant qu'avantage, vous obtenez également des couleurs!
Vous avez plusieurs choix, selon que vous souhaitez conserver l'ordre alphabétique.
Vous pouvez simplement essayer:
ls -al | trier -k1 -r
ou cela, pour conserver l'ordre alphabétique des fichiers avec les mêmes autorisations:
ls -al | trier -k1,1 -k9,9 -r
ou, comme le dit onze81 (mais cette version énumère tout):
ls -la | grep "^ d" && ls -la | grep "^ -" && ls -al | grep -v "^ [d | -]"
ls- al|sort -k1 -r
fonctionne. Ce qui manquait, c'est juste le -r
drapeau.
./
et ../
ne sera pas les deux premières lignes, dans cet ordre. En dehors de cela, je conviens que c'est la solution la plus efficace.
À la réponse de delerious010 , j'ajouterais que si vous souhaitez commander à l'ancienne:
LANG=C ls -la --group-directories-first
(ou utilisez LC_ALL ou LANGUAGE ou LC_COLLATE réglé sur "C").
Cela donnera quelque chose de similaire à:
.
..
DIR
Dir
dir
.hidden
123
UC_FILE
Uc_file
lc_file
Bien que, si je me souvienne bien, les fichiers à points cachés sont apparus avant les répertoires.
Voici une fonction pour faire ceci (bash ou zsh): Et ... je ne suggère pas que ce soit la meilleure façon, mais c'est celle que j'ai créée et que j'utilise en ce moment:
fonction lss { # Affiche la liste des répertoires avec les répertoires en haut. commande ls --color = always $ @ | egrep '^ d | total' commande ls --color = always $ @ | egrep -v '^ d | total'; }
ls -l
) afin de filtrer par type de fichier comme celui-ci. En outre, cette commande sera brisée sur les espaces (en bash). Vous devez citer comme suit: "$@"
Si vous souhaitez utiliser cette approche, vous pouvez faire quelque chose comme ceci:function lss {local temp="$(command ls -l --color=always "$@")"; egrep --color=never '^d|total' <<<"$temp"; egrep --color=never -v '^d|total' <<<"$temp"}
ls -laX
vous montrera d’abord les répertoires dans l’ordre alphabétique, mais videra la liste des fichiers.
Longues options:
ls
-l # List
--all
-X # Sort alphabetically by entry extension
Autrement ...
find . -d 1 -type d | ls -la | sort -r
OU
ls -la | sort -r
OU
d=`find . -type d -d 1`;f=`find . -type f -d 1`; echo -e -DIRS- "\n$d\n" -FILES- "\n$f"
alias ls='ls -lhF --color'
list_sorted() {
ls $* | grep "^d";
ls $* | grep "^-";
ls $* | grep -v -E "^d|^-|^total"
}
alias ll=list_sorted
J'utilise une combinaison des solutions fournies dans les réponses et les commentaires ici.
ls
Tout d’abord, je remplace le comportement par défaut pour ls
:
-l
: Affiche toujours la liste sous forme de liste unidimensionnelle verticale-h
: Affiche la taille des fichiers de manière lisible par l’homme (par exemple, 4.0K au lieu de 4096)-F
: Afficher les indicateurs comme une barre oblique de fin pour les répertoiresalias ls='ls -lhF --color'
ll
Ensuite, j'écris une fonction contenant la logique de tri. Pour chacun, ls
je lui passe les arguments initialement transmis. Cela me permet d'utiliser l'alias à partir d'un répertoire de travail différent de celui que je veux lister (c'est-à-dire ls -a ~
).
En outre, chaque appel à ls
est dirigé vers une grep
commande. Ici, le tri se passe. ls -l | grep "^d"
par exemple, ne répertorie que les répertoires. Si les répertoires doivent être répertoriés en premier, cela doit également figurer en premier dans la fonction. La prochaine chose est les fichiers.
Enfin, je montre tout ce qui n'est ni un répertoire ni un fichier (ni la ligne indiquant la taille totale du contenu du répertoire). Cela se fait par grepping directoy, les entrées de fichier normales et l'entrée totale, puis en inversant le résultat via l' -v
argument.
list_sorted() {
# List directories
ls $* | grep "^d";
# List regular files
ls $* | grep "^-";
# List everything else (e.g. symbolic links)
ls $* | grep -v -E "^d|^-|^total"
}
Enfin, j'appelle la fonction à une nouvelle commande. En particulier, je ne veux pas écraser ls
au cas où ma fonction serait brisée dans certains scénarios. Ensuite, je veux pouvoir utiliser ls
. Sinon, vous pouvez toujours invoquer la ls
commande sans alias en l'invoquant \ls
.
alias ll=list_sorted
;
au lieu de &&
comme un délimiteur pour les commandes. Sinon, il est impossible de répertorier le contenu des répertoires ne contenant pas de répertoires (la première commande ls est évaluée à false, ce qui ne permet pas l'exécution de la commande suivante car elle est associée à &&
. ;
Evite that.)Ceci est une solution de script. Répertorie uniquement les noms, pas de données inode, alphabétiques, non sensibles à la casse, formatés en colonnes. Bien que ce soit ligne-majeur au lieu de colonne majeure comme la sortie par défaut de ls. Les colonnes sont un peu en désordre s'il existe un nom de fichier de> 26 caractères.
rm -f /tmp/lsout
ls -1p | grep / | sort -f >> /tmp/lsout
ls -1p | grep -v / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s %-24s %-24s\n" "${lines[@]}"
Et un autre, avec un formatage supplémentaire.
rm -f /tmp/lsout
echo " ---- Directories ---- " >> /tmp/lsout
ls -1p | grep / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s %-24s %-24s\n" "${lines[@]}"
rm -f /tmp/lsout
echo " ------- Files ------- " >> /tmp/lsout
ls -1p | grep -v / | sort -f >> /tmp/lsout
IFS=$'\n' read -d '' -r -a lines < /tmp/lsout
printf "%-24s %-24s %-24s\n" "${lines[@]}"
La sortie pour le dernier ressemble à ceci, moins les couleurs:
---- Directories ---- archive/ bookmarks/
Desktop/ Documents/ Downloads/
fff/ health/ Library/
Movies/ Music/ Pictures/
Public/ rrf/ scifi/
testdir/ testdir2/
------- Files ------- @todo comedy
delme lll maxims
schedule vtokens style
Rappelez-vous simplement de ne pas alias ou de changer le comportement par défaut de ls puisque ce script l’appelle.
-
vient avant d'd
utilisersort