Gibt es einen einzeiligen Befehl, um chmod interaktiv zu machen?

24

Ich suche etwas wie:

ls | ask_yes_no_for_each_file | chmod +x the_files_approved

Oder eine ähnliche Syntax.

Könnte auch an anderen Befehlen arbeiten, für die Sie eine individuelle Bestätigung wünschen.

Harvey
quelle

Antworten:

45

Das macht was Sie suchen:

find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x

Dies wird findeher verwendet als, lsweil die Parsing- lsAusgabe im Allgemeinen unzuverlässig ist . Dieses Formular findfunktioniert jedoch mit Dateinamen, auch wenn sie Zeilenumbrüche oder andere schwierige Zeichen enthalten.

Erläuterung

  • find . -maxdepth 1 -type f -print0

    Dadurch werden die Dateien ausgewählt. Dies kann mit einer der vielen Optionen von find angepasst werden. Die Option print0teilt findmit, dass die Dateinamen in einer durch Null getrennten Liste gedruckt werden sollen. Dies ist die einzige zuverlässige Methode, um Listen mit Dateinamen zu übertragen.

  • xargs -L1 -p0 chmod +x

    Dabei wird die durch Nullen getrennte Liste der von generierten Dateinamen verwendet findund Ihr Befehl auf diese angewendet.

Die -L1Option sagt xargs, dass immer nur ein Dateiname bearbeitet werden soll. Die -pOption xargsfordert Sie zur Genehmigung auf, bevor Sie fortfahren. Die -0Option gibt xargsan, dass das Nullzeichen als Trennzeichen zwischen den Dateinamen verwendet werden soll.

[Ich war mir der -pOption nicht bewusst , xargsbis @kwan darauf hingewiesen hat.]

John1024
quelle
Sie können den findBefehl POSIX kompatibel machen, indem Sie verwenden-exec printf '%s\0' {} + . Denken Sie jedoch nicht, dass es eine Möglichkeit gibt, das Ganze POSIX-kompatibel zu machen.
10.
Diese Syntax gibt mir eine Warnung find: warning: you have specified the -maxdepth option after a non-option argument -type, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.Also funktioniert es mit dem -maxdepth 1vor dem -type f, als:find . -maxdepth 1 -type f -print0 | xargs -L1 -p0 chmod +x .
Harvey
@ Harvey Sie haben Recht: Ich habe die Antwort aktualisiert, um diese Warnung zu entfernen.
John1024
25

Sie können verwenden xargs.

z.B:

ls|xargs -I path -p chmod +x path

Option -p: Fordern Sie den Benutzer auf, jede Befehlszeile auszuführen und eine Zeile vom Terminal zu lesen. Führen Sie die Befehlszeile nur aus, wenn die Antwort mit 'y' oder 'Y' beginnt.

Kwan
quelle
1
+1 Ihre Verwendung gefällt mir xargs -pso gut, dass ich sie kopieren werde.
John1024
1
Perfekt! Und sehr einfache Möglichkeit, die meisten Befehle interaktiv zu gestalten. Vielen Dank.
Harvey
@Kroltan - warum sollte jemand eine neue Zeile in einem Dateinamen verwenden?
nbubis
1
@nbubis Es kann vorkommen: Gehen Sie zu einem Terminal und geben Sie ein touch "a very long file nameund drücken Sie die Eingabetaste. Sehen Sie sich die Fortsetzung der Zeile an, geben Sie einfach das abschließende Anführungszeichen ein und drücken Sie erneut die Eingabetaste. tadaa, Zeilenumbruch im Dateinamen. Aus Faulheit, einen langen Dateinamen erneut einzugeben.
Kroltan