Wie man * mit versteckten Dateien in einem Verzeichnis vergleicht

21

Wie werden die versteckten Dateien in den angegebenen Verzeichnissen abgeglichen?

beispielsweise

Wenn ich den folgenden Befehl gebe, gibt es nicht das Ergebnis der versteckten Dateien,

 du -b maybehere*/*

wie man dies einfach mit einem einzigen Befehl anstatt mit erreicht

du -b maybehere*/.* maybehere*/*

da muss ich vielleicht zweimal tippen.

vidhan
quelle
Probieren Sie es einfach aus maybehere*/.*und hängen Sie es für alle an
Costas
1
Ihre Bearbeitung erstellt eine neue Frage mit zusätzlichen Einschränkungen, die das Q zu einem sich bewegenden Ziel macht und die bereits gegebenen Antworten ungültig macht. Das ist schlechtes Benehmen, stellen Sie einfach eine neue Frage, wenn Sie eine haben.
Anthon

Antworten:

22

Nutzen Sie die Klammererweiterung:

du -b maybehere*/{*,.[^.],.??*}

oder alternativ

du -b maybehere*/{,.[^.],..?}*

Die Logik dahinter ist wahrscheinlich nicht offensichtlich, daher hier eine Erklärung:

  • * findet alle nicht versteckten Dateien
  • .[^.]Sucht nach Dateien, deren Namen mit einem Punkt beginnen, gefolgt von keinem Punkt. Das sind nur 2-stellige Dateinamen in der ersten Form.
  • .??* findet versteckte Dateien, die mindestens 3 Zeichen lang sind
  • ..?* Wie oben, aber das zweite Zeichen muss ein Punkt sein

Der springende Punkt ist, harte Links zum aktuellen und übergeordneten Verzeichnis ( .und ..) auszuschließen , aber alle normalen Dateien so einzuschließen, dass jede von ihnen nur einmal gezählt wird!

Am einfachsten wäre es zum Beispiel, einfach zu schreiben

du -b maybehere*/{.,}*

Dies bedeutet, dass die Liste einen Punkt .und "nichts" enthält (nichts ist dazwischen ,und schließt sich }), sodass alle versteckten Dateien (die mit einem Punkt beginnen) und alle nicht versteckten Dateien (die mit "nichts" beginnen) übereinstimmen würden. Das Problem ist, dass dies auch passt .und .., und das ist höchstwahrscheinlich nicht das, was Sie wollen, also müssen wir es irgendwie ausschließen.


Letztes Wort zur Klammererweiterung.

Die geschweifte Klammer ist ein Mechanismus, mit dem Sie mehr Dateien / Zeichenfolgen / was auch immer in die Befehlszeile einfügen können, indem Sie weniger Zeichen schreiben. Die Syntax lautet {word1,word2,...}, dh es handelt sich um eine Liste von durch Kommas getrennten Zeichenfolgen, die von {und mit beginnen und enden }. bashHandbuch gibt ein sehr einfaches und gleichzeitig sehr häufiges Anwendungsbeispiel:

$ echo a{b,c,d}e
abe ace ade
jimmij
quelle
Was ist die Verwendung der { }Ich habe keine Ahnung :(
Können
@vidhan seht euch die Bearbeitung an und schaut euch das man bashKapitel " Klammererweiterung " an.
Jimmy
würden Sie mir mehr Erklärung für die oben Ans wenig Geistes, um deutlicher zu erklären , wie alles funktioniert , wie ich mit diesen Dingen @jimmij bin
Vidhan
6
.??*stimmt nicht überein .a, .b... .[^.]*stimmt nicht überein ..foo.
Stéphane Chazelas
4
.foopasst zu beiden .[^.]*und .??*. Sie möchten {.[!.],..?,}*.
Stéphane Chazelas
14

Da Sie bereits GNU-spezifische Syntax ( -b) verwenden:

du -abd1 maybehere*/

Auf diese Weise werden dudie Dateien in den maybehere*Verzeichnissen aufgelistet (und Punktdateien werden nicht ausgeschlossen). -d1Beschränkt die Berichterstattung über die Datenträgernutzung auf eine Ebene nach unten (einschließlich Nichtverzeichnisse mit -a).

Andernfalls hat jede Shell ihre eigene Syntax , damit Globs versteckte Dateien (außer .und ..) enthalten:

  • zsh:

    du -b maybehere*/*(D)
  • ksh93:

    (FIGNORE='@(.|..)'; du -b maybehere*/*)
  • bash:

    (shopt -s dotglob; du -b maybehere*/*)
  • tcsh:

    (set globdot; du -b maybehere*/*)
  • yash:

    (set -o dot-glob; du -b maybehere*/*)

    Vorsicht, es enthält .und ..auf Systemen, die sie enthalten readdir() , wodurch es kaum verwendbar ist.

Stéphane Chazelas
quelle
8

Eine andere Option ist hier verfügbar :

du -sm .[!.]* *
Fábio
quelle
Warum sollten Sie Dateinamen überspringen, die mit beginnen ..?
Kusalananda
2
Vermutlich, weil sie nicht alles in ../und darunter auflisten wollen .
Shadur
Dies zählt keine Dateien wie zB ..myfile; dafür hinzufügen ..?*. Aber +1 für die Verwendung der richtigen Glob-Syntax für negative Übereinstimmungen.
Pedro Gimeno
0

Wenn Sie nur versteckte Verzeichnisse auflisten oder versteckte Verzeichnisse bearbeiten möchten, können Sie, wie Costas sagte, verwenden

du -b maybehere*/.*

Auf diese Weise können Sie versteckte Dateien und Verzeichnisse bearbeiten. Wenn Sie nur versteckte Verzeichnisse möchten, können Sie dies mit angeben

du -b maybehere*/.*/

SailorCire
quelle
Kannst du bitte die Frage noch einmal sehen? @SailorCire Ich habe sie ein bisschen bearbeitet
vidhan
@vidhan also willst du nur versteckt in einem verzeichnis arbeiten? Ist das korrekt?
SailorCire
nein Ich möchte sowohl versteckte als auch nicht versteckte Dateien in einem Verzeichnis maybehere*/.*maybehere*/*
abgleichen,
@vidhan du -bnimmt sowohl versteckte als auch nicht versteckte auf.
SailorCire
nein :( leider @SailorCire
vidhan
0

Sie können find zwar nicht direkt schälen, aber mit dieser eingeschränkten Tiefe verwenden

find maybehere -maxdepth 1 -exec du -sh {} \;
k3a
quelle