Comment répertorier les fichiers et les répertoires avec les répertoires en premier


22

J'ai deux questions. Premièrement, quelle commande répertorie les fichiers et les répertoires, mais répertorie les répertoires en premier?

Deuxième question: je veux copier une liste de fichiers dans un seul répertoire, mais faire du répertoire cible le premier nom de fichier dans la commande.


5
lsa un --group-directories-firstinterrupteur.
jasonwryan

1
-test peut-être une option GNU uniquement cpqui prend un répertoire cible explicite et peut donc aller n'importe où dans la ligne de commande, y compris le début.
jw013

Réponses:


36

Vous avez GNU?

La version gnu de lshas --group-directories-first. Et cpa -t.

Pas de GNU?

Sur les systèmes qui n'ont pas de gnu ls, votre meilleur pari est de deux appels successifs findavec -maxdepth n/ -mindepth net -type tavec les options appropriées.

find . -maxdepth 1 -mindepth 1 -type d
find . -maxdepth 1 -mindepth 1 \! -type d

Pour copier des fichiers, avec la cible en premier, vous devez écrire un script qui enregistre le premier argument, puis utilise shiftet ajoute l'argument à la fin.

#!/bin/sh
target="$1"
shift
cp -r -- "$@" "$target"

Fais attention!

Si vous envisagiez de les utiliser ensemble - c'est-à-dire de collecter la liste à partir de ( findou lséventuellement en utilisant xargs) et de la transmettre à cp(ou à un cpwrapper), vous devez être conscient des dangers que présente l'analyse des listes de fichiers (en gros, les noms de fichiers peuvent contiennent des caractères comme les sauts de ligne qui peuvent gâcher votre script). Plus précisément, regard sur findl « -execet des -print0options et xargs» de -0l'option.

Un outil alternatif pour copier efficacement les arborescences de répertoires.

Vous voudrez peut-être envisager d'utiliser rsyncplutôt; il a beaucoup de fonctionnalités qui pourraient vous faciliter la tâche.


C'est bien. Plus généralement, existe-t-il un moyen de savoir si j'ai la version GNU? (autre que d'essayer l'option --group-directories-first).
Amelio Vazquez-Reina

3
Vous pouvez courir ls --versionpour découvrir lequel vous avez.
Shawn J.Goff

6

Liste des répertoires en premier pour un non-GNU ls:

ls -l | sort

Remarque, cela répertoriera tous les autres trucs étranges comme les liens symboliques, les sockets et les tuyaux (bien regroupés, bien sûr), mais étant donné que ces trucs sont assez rares, cela ne devrait pas poser de problème. Sinon, le filtre seraitls -l | grep '^(-|d)' | sort


1
+1 intelligent et plus court que la réponse acceptée. Sauf que ça devrait vraiment l'être sort -r.
PythonNut

1
ls -l | sorte n'a pas fonctionné pour moi sur un Mac. Il regroupe d'abord les répertoires mais il ne les a pas triés ni les noms de fichiers qui ont suivi.
Ray

notez également: en utilisant le `| sort` supprimera votre couleur car elle est maintenant du texte.
JayRizzo

5

fonctionne pour bash et zsh

ajoutez simplement un alias dans ~ / .bashrc ou ~ / .zshrc

# Colorize the ls output ##
alias ls='LC_COLLATE=C ls -h --group-directories-first --color=auto'

De plus, si vous avez ZSH, vous pouvez utiliser l' utilitaire "k"

k -h --group-directories-first

entrez la description de l'image ici

il suffit de l'installer avec antigen, en mettant ce qui suit dans ~ / .zshrc

antigen bundle reduxionist/k --branch=add-sort-options

1
jolie réponse pour proposer l'alias.
рüффп

1

Pour les non-GNU, awk peut filtrer tous les autres champs:

ls -l | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
  • NF == 9: la sortie de ls -lmust contient 9 champs
  • si la ligne commence par «d», imprime un «/» supplémentaire
  • sinon juste le nom du fichier

La sortie ressemble ls -1mais avec les répertoires en premier:

node_modules/
src/
e2e/
angular.json
tslint.json
package.json
README.md

Selon "The Long Format" de la page de manuel ls, lorsque d'autres types de fichiers sont impliqués, l'ordre de sortie doit être:

   s     Socket link.
   p     FIFO.
   l     Symbolic link.
   d     Directory.
   c     Character special file.
   b     Block special file.
   -     Regular file.

Une fonction bash pratique (mettez-la dans votre .bash_profile ou .bashrc):

function l1() {
  ls -l $* | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
}

0

Pour zshles listes d'achèvement, vous pouvez définir le list-dirs-firststyle pour trueque les répertoires soient affichés en premier. Dans votre ~/.zshrc:

zstyle ':completion:*' list-dirs-first true

(ici appliqué à tous les widgets d'achèvement qui le prennent en charge et à toutes les commandes; vous pouvez restreindre cela si vous le souhaitez, consultez la zstyledocumentation pour plus de détails)

Si vous ne l'avez pas déjà fait, assurez-vous d'exécuter compinstallégalement pour obtenir des listes d'achèvement en couleur, avec des descriptions, etc. et tous les autres goodies.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.