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.
command-line
shell-script
ls
Elham Abbasi
quelle
quelle
ls
hat einen--group-directories-first
Schalter.-t
ist möglicherweise eine Nur-GNU-Optioncp
, die ein explizites Zielverzeichnis benötigt und daher an eine beliebige Stelle in der Befehlszeile, einschließlich des Anfangs, verschoben werden kann.Antworten:
Haben Sie GNU?
Die Gnu-Version von
ls
hat--group-directories-first
. Undcp
hat-t
.Kein GNU?
Auf Systemen ohne Gnu
ls
sind zwei aufeinanderfolgende Aufrufefind
mit-maxdepth n
/-mindepth n
und-type t
mit den entsprechenden Optionen die beste Wahl.Zum Kopieren von Dateien müssten Sie zuerst mit dem Ziel ein Skript schreiben, das das erste Argument speichert, dann verwendet
shift
und das Argument an das Ende anfügt.Achtung!
Wenn Sie vorhatten, diese zusammen zu verwenden, dh die Liste von
find
oderls
(möglicherweise mithilfe vonxargs
) zu sammeln und ancp
(oder einencp
Wrapper) 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 infind
‚s-exec
und-print0
Optionen undxargs
‘ s --0
Option.Ein alternatives Tool zum effizienten Kopieren von Verzeichnisbäumen.
Vielleicht möchten Sie
rsync
stattdessen die Verwendung untersuchen . Es hat viele Funktionen, die Ihre Arbeit erleichtern könnten.quelle
--group-directories-first
).ls --version
, um herauszufinden, welche Sie haben.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 Filter
ls -l | grep '^(-|d)' | sort
quelle
sort -r
.funktioniert für bash und zsh
Füge einfach einen Alias in ~ / .bashrc oder ~ / .zshrc hinzu
Auch wenn Sie ZSH haben, können Sie mit „k“ Dienstprogramm
Installieren Sie es einfach mit Antigen, indem Sie Folgendes in ~ / .zshrc einfügen
quelle
Für
zsh
die Vervollständigungslisten können Sie denlist-dirs-first
Stil so einstellen ,true
dass Verzeichnisse zuerst angezeigt werden. In Ihrem~/.zshrc
:(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
zstyle
Informationen finden Sie in der Dokumentation.)Wenn Sie dies noch nicht getan haben, stellen Sie sicher, dass Sie
compinstall
auch ausgeführt werden, um Vervollständigungslisten in Farbe, mit Beschreibungen usw. und allen anderen Extras zu erhalten.quelle
Für Nicht-GNU kann awk alle anderen Felder filtern:
ls -l
must enthält 9 FelderDie Ausgabe sieht wie
ls -1
folgt aus:Wenn andere Dateitypen beteiligt sind, sollte die Ausgabereihenfolge laut "The Long Format" der Manpage lauten:
Eine praktische Bash-Funktion (in Ihr .bash_profile oder .bashrc einfügen):
quelle