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 ..?

Zanna
quelle

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
heemayl
quelle
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 :)

Rinzwind
quelle
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.

Wayne_Yux
quelle
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