So listen Sie zuerst Dateien und Verzeichnisse mit Verzeichnissen auf

22

Ich habe zwei Fragen. Welcher Befehl listet zuerst Dateien und Verzeichnisse auf, aber zuerst Verzeichnisse?

Zweite Frage: Ich möchte eine Liste von Dateien in ein einzelnes Verzeichnis kopieren, aber das Zielverzeichnis zum ersten Dateinamen im Befehl machen.

Elham Abbasi
quelle
5
lshat einen --group-directories-firstSchalter.
Jasonwryan
1
-tist möglicherweise eine Nur-GNU-Option cp, die ein explizites Zielverzeichnis benötigt und daher an eine beliebige Stelle in der Befehlszeile, einschließlich des Anfangs, verschoben werden kann.
Jw013

Antworten:

36

Haben Sie GNU?

Die Gnu-Version von lshat --group-directories-first. Und cphat -t.

Kein GNU?

Auf Systemen ohne Gnu lssind zwei aufeinanderfolgende Aufrufe findmit -maxdepth n/ -mindepth nund -type tmit den entsprechenden Optionen die beste Wahl.

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

Zum Kopieren von Dateien müssten Sie zuerst mit dem Ziel ein Skript schreiben, das das erste Argument speichert, dann verwendet shiftund das Argument an das Ende anfügt.

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

Achtung!

Wenn Sie vorhatten, diese zusammen zu verwenden, dh die Liste von findoder ls(möglicherweise mithilfe von xargs) zu sammeln und an cp(oder einen cpWrapper) zu übergeben, sollten Sie sich der Gefahren bewusst sein, die beim Analysieren von Dateilisten (im Grunde können Dateinamen) auftreten Zeichen wie Zeilenumbrüche enthalten, die Ihr Skript durcheinander bringen können). Insbesondere Blick in find‚s -execund -print0Optionen und xargs‘ s - -0Option.

Ein alternatives Tool zum effizienten Kopieren von Verzeichnisbäumen.

Vielleicht möchten Sie rsyncstattdessen die Verwendung untersuchen . Es hat viele Funktionen, die Ihre Arbeit erleichtern könnten.

Shawn J. Goff
quelle
Das ist toll. Kann ich allgemein wissen, ob ich die GNU-Version besitze? (außer die Option auszuprobieren --group-directories-first).
Amelio Vazquez-Reina
3
Sie können rennen ls --version, um herauszufinden, welche Sie haben.
Shawn J. Goff
6

Verzeichnisse für Nicht-GNU zuerst auflisten ls:

ls -l | sort

Beachten Sie, dass dies auch alle anderen seltsamen Dinge wie Symlinks, Sockets und Pipes auflistet (natürlich entsprechend gruppiert), aber wenn man bedenkt, dass solche Dinge ziemlich selten sind, sollte das kein Problem sein. Sonst wäre der Filterls -l | grep '^(-|d)' | sort

Alexander Shcheblikin
quelle
1
+1 klug und kürzer als die akzeptierte Antwort. Nur dass es wirklich so sein sollte sort -r.
PythonNut
1
ls -l | sort hat auf einem Mac bei mir nicht funktioniert. Die Verzeichnisse werden zuerst gruppiert, aber weder sortiert noch die darauf folgenden Dateinamen.
Ray
Beachten Sie auch: Verwenden Sie das `| sort` entfernt deine Farbe, da es sich jetzt um Text handelt.
JayRizzo
4

funktioniert für bash und zsh

Füge einfach einen Alias ​​in ~ / .bashrc oder ~ / .zshrc hinzu

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

Auch wenn Sie ZSH haben, können Sie mit „k“ Dienstprogramm

k -h --group-directories-first

Bildbeschreibung hier eingeben

Installieren Sie es einfach mit Antigen, indem Sie Folgendes in ~ / .zshrc einfügen

antigen bundle reduxionist/k --branch=add-sort-options
DmitrySemenov
quelle
1
nette antwort um den alias anzubieten.
рüффп
0

Für zshdie Vervollständigungslisten können Sie den list-dirs-firstStil so einstellen , truedass Verzeichnisse zuerst angezeigt werden. In Ihrem ~/.zshrc:

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

(Hier gilt dies für alle Completion-Widgets, die dies unterstützen, und für alle Befehle. Sie können dies einschränken, wenn Sie möchten. Weitere zstyleInformationen finden Sie in der Dokumentation.)

Wenn Sie dies noch nicht getan haben, stellen Sie sicher, dass Sie compinstallauch ausgeführt werden, um Vervollständigungslisten in Farbe, mit Beschreibungen usw. und allen anderen Extras zu erhalten.

Stéphane Chazelas
quelle
0

Für Nicht-GNU kann awk alle anderen Felder filtern:

ls -l | sort -r | awk 'NF==9 { if ($1~/^d/) { print $9 "/" } else { print $9 } }'
  • NF == 9: Die Ausgabe von ls -lmust enthält 9 Felder
  • Wenn die Zeile mit 'd' beginnt, wird ein zusätzliches '/' ausgegeben.
  • ansonsten nur der Dateiname

Die Ausgabe sieht wie ls -1folgt aus:

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

Wenn andere Dateitypen beteiligt sind, sollte die Ausgabereihenfolge laut "The Long Format" der Manpage lauten:

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

Eine praktische Bash-Funktion (in Ihr .bash_profile oder .bashrc einfügen):

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