Erteilen Sie Ausführungsberechtigung nur für Dateien in „bin“-Unterverzeichnissen

Erteilen Sie Ausführungsberechtigung nur für Dateien in „bin“-Unterverzeichnissen

Ich habe ein übergeordnetes Verzeichnis mit einer Reihe von Anwendungen, jede davon hat ihre eigenen binUnterverzeichnisse

parent
--app1
  --bin
  --(maybe some other bins on even lower level)
--app2
  --bin
...

Ich möchte eine Ausführungsberechtigung für die Dateien im binOrdner 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 binin 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 -Rbei jedem zu tun bin, aber um eine sauberere Methode zu finden, möchte ich es +xnur auf die Dateien anwenden.

Antwort1

Dies muss xfür die Verzeichnisse zugelassen werden: Das Auflisten eines Verzeichnisses (und damit das Suchen einer Datei darin) ist der Zweck dieser xBerechtigung für ein Verzeichnis.

Das heißt, mit

-exec chmod -R a+x {}/* \;

weist xnur 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 binVerzeichnisse 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 findAnrufe:

    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 -print0usw. anpassen.)

  • find -execLeider ist eine direkte Verschachtelung in einem anderen nicht möglich find -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 -execdiranstelle von verwendet -exec, um eine problematische {}-Verschachtelung zu vermeiden.

verwandte Informationen