Wie lassen sich alle Dateien mithilfe von find ohne Auswirkung auf Verzeichnisse rekursiv machen?

4308
wting

Ich muss das ausführbare Flag aus allen Dateien in einem bestimmten Verzeichnis und in Unterverzeichnissen entfernen. Im Moment mache ich es in zwei Schritten

find /dir/ -type f -exec chmod ugo-x {} \; find /dir/ -type d -exec chmod ugo+rx {} \; 

Ist es möglich, die erste Zeile so zu ändern, dass das exec-Flag aus allen Nicht-Verzeichnisdateien entfernt werden kann? Da dies ziemlich regelmäßig in vielen Verzeichnissen und Dateien erfolgen muss, würde ich es vorziehen, kein Bash-Skript zu verwenden, das die Geschwindigkeit verlangsamt.

4
Was tut Ihr aktueller Befehl aus Neugier nicht richtig? Das Prädikat `-type f` selektiert bereits alle Dateien (oder alle Nicht-Verzeichnisdateien), da alles, was eine Datei ist, nicht auch ein Verzeichnis sein kann. David Z vor 13 Jahren 0
@David: Sockets, FIFOs, Symlinks, Geräte usw. Ignacio Vazquez-Abrams vor 13 Jahren 0
@Ignacio: Ja, aber die Frage drehte sich um Dateien, nicht um all die anderen Dinge, die keine Dateien waren. David Z vor 13 Jahren 0
@ David: Dies ist * nix. Alles ist eine Datei. Ignacio Vazquez-Abrams vor 13 Jahren 0
@ Ignacio: Alles hat einen Dateisystempfad, sicher, aber man kann nicht immer sagen, dass alles tatsächlich eine Datei ist. Einige Leute tun dies, aber andere verwenden "file" im Sinne einer regulären Datei, dh etwas, das mit dem `-type f`-Prädikat 'find' übereinstimmen würde. Für mich hat der Wortlaut dieser Frage die letztere Bedeutung deutlich gemacht. David Z vor 13 Jahren 1

1 Antwort auf die Frage

4
Ignacio Vazquez-Abrams
find ... '!' -type d ... 
Vielen Dank, ich wusste nicht, dass es Operatoren gab. Sind die einfachen Anführungszeichen erforderlich, da ich es ohne sie schaffen konnte? wting vor 13 Jahren 0
Es hängt von Ihrer Shell und ihren Optionen ab. bash verwendet '!' in der History-Erweiterung, daher ist es eine gute Idee, es in der CLI zu zitieren. Sie werden es wahrscheinlich nicht in einem Skript brauchen. Ignacio Vazquez-Abrams vor 13 Jahren 1
Historienerweiterung ist in Skripten nicht aktiv, richtig. Daenyth vor 13 Jahren 0