Ich habe ein übergeordnetes Verzeichnis mit einer Reihe von Anwendungen, jede davon hat ihre eigenen bin
Unterverzeichnisse
parent
--app1
--bin
--(maybe some other bins on even lower level)
--app2
--bin
...
Ich möchte eine Ausführungsberechtigung für die Dateien im bin
Ordner selbst hinzufügen, nicht jedoch für diesen.
Die obige Struktur ist jedoch nicht regulär (ich kann also nicht einfach eine Schleife verwenden, um vorherzusagen, dass sich ein Wert bin
in einer bestimmten Tiefe/Ebene befindet).
Bisher habe ich Folgendes:
find /parent -type d -iname "bin" -exec chmod -R a+x {} \;
Ich weiß, dass es nicht schadet, dies chmod -R
bei jedem zu tun bin
, aber um eine sauberere Methode zu finden, möchte ich es +x
nur auf die Dateien anwenden.
Antwort1
Dies muss x
für die Verzeichnisse zugelassen werden: Das Auflisten eines Verzeichnisses (und damit das Suchen einer Datei darin) ist der Zweck dieser x
Berechtigung für ein Verzeichnis.
Das heißt, mit
-exec chmod -R a+x {}/* \;
weist x
nur den Inhalt eines Verzeichnisses zu, nicht das Verzeichnis selbst.
Wenn Sie verschachtelte Verzeichnisse berücksichtigen möchten bin
, verwenden Sie etwas in der Art von
while read F; do \
test -f "$F" || continue \
test $(basename $(dirname "$F")) == "bin" || continue \
chmod a+x "$F" \
done < find /path/to/base -type f
Antwort2
Es gibt mehrere Ansätze:
Wie Eugen erwähnt hat, ist +x bei Verzeichnissen normal – es ist sogar erforderlich, um auf die Inhalte zugreifen zu können. Wenn die Skripte weltweit ausführbar sein sollen, ist es sinnvoll, mit Ihrer aktuellen Methode fortzufahren und die Verzeichnisse ebenfalls weltweit durchsuchbar zu machen.
Sie können sich auf die erweiterten Globs von Bash verlassen, um alle
bin
Verzeichnisse in jeder Tiefe zu erfassen:shopt -s globstar; find **/bin/ -type f -exec chmod a+x {} \;
Das Gleiche, aber ohne Typprüfung:
shopt -s globstar; chmod -R a+x **/bin/
Verwenden Sie mehrere
find
Anrufe:find . -type d -name bin | while read -r path; do find "$path/" -type f -exec chmod a+x {} \; done
(Dies setzt voraus, dass Ihre Dateinamen keine Zeilenumbrüche enthalten. Wenn doch, sollten Sie sich Sorgen machen – und das zu verwendende Beispiel
-print0
usw. anpassen.)find -exec
Leider ist eine direkte Verschachtelung in einem anderen nicht möglichfind -exec
, Sie können jedoch ein Skript aufrufen, das anschließend find -exec aufruft:find . -type d -name bin -execdir sh -c "find . -type f -exec chmod a+x {} \;" \;
Dies wird
-execdir
anstelle von verwendet-exec
, um eine problematische {}-Verschachtelung zu vermeiden.