Mein Ziel ist täuschend einfach (zumindest für mich). Ich möchte die Ausgabe von ls -l
oder übernehmen ls -lh
und nur ein Feld auswählen.
Ich möchte, dass dies so kugelsicher wie möglich ist. Ich gehe also davon aus, dass Dateinamen eine variable Anzahl von Leerzeichen haben können, nicht alle Felder die gleiche Länge haben usw.
Bonuspunkte für ein Skript, das den Namen des Feldes (oder auch nur eine Feldnummer) verwendet und dann den Inhalt des Feldes zurückgibt.
Ich möchte mich umdrehen
in:
command-line
bash
soandos
quelle
quelle
ls
. Derfind
Befehl ist enorm hilfreich.ls -l --block-size=M
?ls
Befehl ist kein POSIX-Standard, daher kann ein Skript, das von abhängtls
, auf verschiedenen Systemen oder sogar im Laufe der Zeit fehlerhaft sein . Weitere Informationen finden Sie in der Antwort von @ormaaj auf dieser Seite. Eine Möglichkeit, das zu tun, was Sie verlangen, ist eine Bash-Schleife. Hier ist ein Beispiel.for FILENAME in *; do FILESIZE=$(( $( stat --format=%s "${FILENAME}" ) / 1024 )); echo "${FILENAME}" ${FILESIZE}; done
. Natürlichecho
würden Sie stattdessen Ihre Verarbeitung verwenden.... | xargs -d '\n' du -m
die es genauso gut funktioniert.-exec
Option ansehenfind
.Niemals ls analysieren . Verwenden Sie GNU
find
. Oder wenn Portabilität ist nicht wichtig,stat(1)
.Informationen zum zeilenweisen Lesen anderer Daten als Listen von Dateinamen und zum Aufteilen in Felder finden Sie unter: BashFAQ / 001
Es gibt keine Methoden zum zuverlässigen Lesen einer durch Zeilenumbrüche getrennten Liste von Dateinamen, die unter den meisten Umständen sinnvoll sind.
quelle
Sie können die bestimmte Spalte in der Shell wie folgt abrufen:
oder
awk
wie in @Corey Antwort gezeigt ,cut -c44-45
würde auch nach der Anpassung funktionieren (dals
hat Spalten behoben), oder was auch immer sonst, das Hauptproblem ist jedoch, dass es nicht zuverlässig und kugelsicher ist (z. B. unter Unix kann es sein$6
, nicht$7
, und es Änderungen in Abhängigkeit von Argumenten) machen es nicht maschinenfreundlich, daher wird es nicht empfohlen, denls
Befehl überhaupt zu analysieren .Verwenden Sie am besten verschiedene verfügbare Befehle wie
find
oderstat
, um die Ausgabe nach Bedarf zu formatieren. Beispielsweise:Führen Sie das folgende Beispiel aus, um eine Spalte mit nur Tagen an Änderungen zurückzugeben:
Es ist zu beachten, dass GNU
stat
andere Optionen als BSD haben kannstat
, so dass es unter verschiedenen Betriebssystemen immer noch nicht kugelsicher ist.quelle
stat
.date
ist jedoch falsch eingerichtet. Sie sollten hinzufügen--date=$ymd
, dadate
der aktuelle Tag von sich aus gedruckt wird, aber der Zweck hier ist es, das Datumsformat der Datei zu konvertierenls -la | cut -c32-33
Befehl ist absolut unzuverlässig, nicht nur wegen der möglichen Fallstricke bei den Dateinamen, sondern einfach, weil er von der Länge der Benutzernamen und der Größe der Dateien abhängt. Derstat -c "%x" *.*
Befehl sieht in*.*
Ordnung aus, aber wenn Sie ihn verwenden, beschränken Sie ihn nur auf Dateinamen, die einen Punkt enthalten. Ich denke, die Absicht war es, auch versteckte Dateien zu fangen; in diesem Fall sollten Sie Globbing für dotfiles ermöglichen vorher und verwenden*
statt*.*
:shopt -s dotglob; stat -c "%x" * | [...]
.--date="$ymd"
demdate
Befehl hinzufügen , sonst wird der aktuelle Tag des Monats gedruckt.