Wie soll ich Glob für alle versteckten Dateien?


22

Ich möchte eine Aktion (sagen wir chown) für alle versteckten Dateien in einem Verzeichnis ausführen .

Ich weiß , dass dies .*ist nicht eine gute Idee , weil es auch die aktuellen finden .und übergeordnete ..Verzeichnisse (Ich weiß , dass rmwird nicht funktionieren auf .und ..aber auch andere Befehle, einschließlich chownund chmodwird glücklich wirksam)

Aber alle meine versteckten Dateien haben unterschiedliche Namen!

Wie soll ich für alle versteckten Dateien glob unter Ausschluß .und ..?

Antworten:


20

Sie können das folgende extglobMuster verwenden:

.@(!(.|))
  • .Findet ein Zeichen .auf dem ersten

  • @()Ist ein extglobMuster, passt es zu einem der Muster im Inneren, da wir nur ein Muster darin haben, wird es das auswählen

  • !(.|)ist ein anderes extglob(verschachteltes) Muster, das mit keiner oder keiner Datei übereinstimmt .. Wie wir bereits .beim Start abgeglichen haben, stimmt dieses gesamte Muster mit allen Dateien überein, die mit .Ausnahme von .und beginnen ...

extglobist in interaktiven Sitzungen bashstandardmäßig in Ubuntu aktiviert. Wenn nicht, aktivieren Sie es zuerst:

shopt -s extglob

Beispiel:

$ echo .@(!(.|))
.bar .foo .spam

Das ist eindeutig eine großartige Sache, über die ich lernen muss! Vielen Dank für den Unterricht
Zanna

@ Zanna Froh, dass ich helfen konnte :)
Heemayl

2
Was ist der Zweck von @()? Simple .!(.|)scheint identisch zu funktionieren.
Kyle Strand

1
Ich weiß, dass dies alt ist, aber ich habe die gleiche Frage wie @KyleStrand. Bei meinen Tests !(.|)funktioniert das genauso. Gibt es @()in diesem Zusammenhang einen Grund dafür?
Paddy Landau

Ist der Knallcharakter eine Negation? Es wird nicht erwähnt, und wenn Sie Ihre Erklärung lesen, habe ich den Eindruck, dass das Muster mit Punkt und Doppelpunkt übereinstimmt, aber Sie beschreiben klar Dateien, die mit einem Startpunkt übereinstimmen, außer nur diesen beiden.
Benutzer unbekannt

20
 GLOBIGNORE=".:.."

das verstecken. und .. Verzeichnisse. Dies setzt auch die dotglobOption:* sowohl versteckte als auch nicht versteckte Dateien abgeglichen.

Sie können auch tun

shopt -s dotglob

Gilles :)


9

Sie können findhier einen Befehl verwenden. Zum Beispiel so etwas wie

find -type f -name ".*" -exec chmod 775 {} \;

Dadurch werden versteckte Dateien gefunden und Berechtigungen geändert


Bearbeiten, um den Kommentar von @gerrit einzuschließen:

find -type f -maxdepth 1 -name ".*" -exec chmod 775 {} \;

Dadurch wird die Suche auf das aktuelle Verzeichnis beschränkt, anstatt rekursiv zu suchen.


4
Möglicherweise möchten Sie ein -maxdepth 1hier hinzufügen , damit es dem Verhalten in der Frage und den anderen Antworten besser entspricht.
Gerrit
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.