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.
command-line
shell-script
ls
Elham abbasi
la source
la source
ls
a un--group-directories-first
interrupteur.-t
est peut-être une option GNU uniquementcp
qui prend un répertoire cible explicite et peut donc aller n'importe où dans la ligne de commande, y compris le début.Réponses:
Vous avez GNU?
La version gnu de
ls
has--group-directories-first
. Etcp
a-t
.Pas de GNU?
Sur les systèmes qui n'ont pas de gnu
ls
, votre meilleur pari est de deux appels successifsfind
avec-maxdepth n
/-mindepth n
et-type t
avec les options appropriées.Pour copier des fichiers, avec la cible en premier, vous devez écrire un script qui enregistre le premier argument, puis utilise
shift
et ajoute l'argument à la fin.Fais attention!
Si vous envisagiez de les utiliser ensemble - c'est-à-dire de collecter la liste à partir de (
find
ouls
éventuellement en utilisantxargs
) et de la transmettre àcp
(ou à uncp
wrapper), 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 surfind
l «-exec
et des-print0
options etxargs
» de-0
l'option.Un outil alternatif pour copier efficacement les arborescences de répertoires.
Vous voudrez peut-être envisager d'utiliser
rsync
plutôt; il a beaucoup de fonctionnalités qui pourraient vous faciliter la tâche.la source
--group-directories-first
).ls --version
pour découvrir lequel vous avez.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 serait
ls -l | grep '^(-|d)' | sort
la source
sort -r
.fonctionne pour bash et zsh
ajoutez simplement un alias dans ~ / .bashrc ou ~ / .zshrc
De plus, si vous avez ZSH, vous pouvez utiliser l' utilitaire "k"
il suffit de l'installer avec antigen, en mettant ce qui suit dans ~ / .zshrc
la source
Pour les non-GNU, awk peut filtrer tous les autres champs:
ls -l
must contient 9 champsLa sortie ressemble
ls -1
mais avec les répertoires en premier: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:
Une fonction bash pratique (mettez-la dans votre .bash_profile ou .bashrc):
la source
Pour
zsh
les listes d'achèvement, vous pouvez définir lelist-dirs-first
style pourtrue
que les répertoires soient affichés en premier. Dans votre~/.zshrc
:(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
zstyle
documentation 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.la source