Wie finde und ändere ich Berechtigungen für einen Dateityp in einem Ubuntu-Terminal?

2211
David Thomas

Mögliche Duplikate:
Wie chmod 755 alle Verzeichnisse aber keine Datei (rekursiv)?

Ich habe gerade ein Update von Ubuntu 8.04 auf 9.04 vorgenommen, eine zusätzliche Festplatte hinzugefügt /homeund einen iPod (FAT32, leider) verwendet, um die Dateien in der Zwischenzeit zu speichern.

Zurückkopieren dieser Dateien Ich habe festgestellt, dass die Mehrheit der Dateien meines Erachtens auf Grund der Probleme, dass Berechtigungen nicht gesetzt / nicht ordnungsgemäß auf FAT32 festgelegt wurden, nun chmod +xirgendwann effektiv sind .

Ich habe mich gefragt, ob es einen einfachen Weg gibt, alle Dateien eines bestimmten Typs zu finden (sagen Sie .txtoder .css) und die Pipe direkt an chmod -x? Ich habe versucht, mit verschiedenen Sätzen auf dieser Website und einigen anderen zu suchen, konnte aber nichts finden. Ich denke, das ist zwar ein Vokabelproblem.

Vielen Dank für jede Hilfe, die Sie leisten können, und für Ihre Zeit.

1
Bitte ändern Sie den Titel entsprechend der tatsächlichen Frage. nagul vor 14 Jahren 2
Dieses Duplikat hat die gleiche grundlegende Frage und eine viel bessere Antwort: http://superuser.com/questions/91935/how-to-chmod-755-all-directories-but-no-file-rekursiv quack quixote vor 14 Jahren 0

4 Antworten auf die Frage

3
SilentGhost
chmod -R a-x *.txt 

wäre ein Beispiel dafür, aber Sie müssten es für alle unterschiedlichen Dateimuster wiederholen.

Würde das nach * allen * .txt -Dateien auf dem Computer suchen, oder müsste ich bestimmte Verzeichnisse benennen? Und was tun die Schalter / Argumente, weil ich vielleicht ein Idiot bin? +1 für die Antwort =) David Thomas vor 14 Jahren 0
`-R` ist eine rekursive Änderung, es gibt auch eine lange Option:` --recursive`. Ich denke es macht nur das aktuelle Verzeichnis. `ax` setzt` -x` für alle (Benutzer, Gruppe und andere). SilentGhost vor 14 Jahren 0
Wenn Sie ein Set-Verzeichnis haben, in dem Sie dieses ausführen möchten, führen Sie ein `cd / mydirectory` aus und führen Sie dann den Befehl chmod aus Roy Rico vor 14 Jahren 0
Das würde nicht funktionieren. Die Option --recursive hat nur eine Auswirkung, wenn * .txt Verzeichnisse enthält. In diesem Fall werden * alle * Dateien in diesen Verzeichnissen geändert. Ryan Thompson vor 14 Jahren 1
0
Roy Rico

Die Befehlszeile kann auch die Syntax für den Regex-Typ verwenden, sodass Sie Ihren Befehl nur einmal ausführen müssen.

cd /to/my/directory chmod -R a-x *.(txt|css|whatever) 

ok, ich habe versucht es zu testen, aber es klappt nicht genau, ich suche nach der korrekten Syntax, aber ich weiß, dass es möglich ist. Vielen Dank.

Inzwischen..

Das funktioniert definitiv (und ist definitiv übertrieben):

find /to/my/directory -type f | egrep "(txt|css)$" | xargs -t -i{} chmod a-x {} 

Erläuterung:

Der findBefehl listet alle Dateien, Links und Verzeichnisse in einer separaten Zeile auf. Der Pfadname gibt den Startpunkt an. Die -type fOption gibt an, dass nur Dateien gesucht werden sollen.

Der egrepBefehl gibt jede Zeile aus, die dem regulären Ausdruck entspricht. Der "(txt|css)$"reguläre Ausdruck sagt, dass jede Datei, die mit ($) endet, mit txt oder css übereinstimmt.

Der xargsBefehl nimmt die Ausgabe eines Befehls und leitet ihn an die Eingabe eines anderen Befehls weiter (der danach kommt). zum Beispiel:

$> echo a\nb\nc  a b c  $> echo a\nb\n\c | xargs echo a b c 

Normalerweise könnten Sie dies tun, find -type f | xargs echoaber die Ausgabe kann manchmal sehr lang werden, wenn Sie viele Dateien haben. Daher finde ich es besser, die Datei aufzuteilen. soo Die Option -i führt den Befehl für jede Ausgabezeile aus. Der Wert jeder Zeile wird in einer Variablen gespeichert, wobei i als {} definiert ist. Der Befehl -t gibt jeden Befehl aus, der in der Standardausgabe generiert wird, damit Sie sehen können, was passiert.

Ich würde hinzufügen, dass Sie find -print0 | verwenden sollten xargs --null, um Dateien mit Leerzeichen im Namen zu behandeln. Ryan Thompson vor 14 Jahren 0
Sie müssten einen anderen Weg finden, um dies zu tun, der Befehl grep funktioniert nicht (oder schien mir nicht so), mit der Option -print0. Roy Rico vor 14 Jahren 0
Grep hat auch Null-Optionen, -z und -Z für die Eingabe bzw. Ausgabe. Aber Sie brauchen hier kein Grep. Find hat bereits die Optionen -regex und -iregex. Sie brauchen nur etwas wie find DIR-Typ f -iregex '\. (Txt | css) $' | xargs --null BEFEHL Ryan Thompson vor 14 Jahren 0
ah cool, ich habe die -iregex-Option nicht verwendet, also muss ich das probieren. Roy Rico vor 14 Jahren 0
Schalenmuster sind sogenannte Glob-Muster, nicht Regex. Ihr Befehl würde zu Dateinamen mit Leerzeichen oder Anführungszeichen führen. Es ist ziemlich schwierig, den Dateinamen sicher auszudrucken und dann zu analysieren. Das Durchsuchen von Verzeichnissen ist voller Gotchas. ZB http://stackoverflow.com/questions/1841737/hashing-multiple-files-recursively/1842746#1842746 Wenn Sie find -print0 | verwenden können grep -0 | xargs -0, aber normalerweise bist du okay. Peter Cordes vor 14 Jahren 0
0
Ryan Thompson

Als Antwort auf Ihre eigentliche Frage, finden Sie | Die Lösung von xargs ist die richtige.

Um Ihr Stammproblem zu beheben, ist es jedoch unmöglich, alle Dateiberechtigungen ohne einen Verweis ordnungsgemäß wiederherzustellen. Wenn Sie über den Speicherplatz verfügen, können Sie eine virtuelle Maschine erstellen, alle dieselben Pakete installieren (um herauszufinden, wie Sie nach dpkg-Get-Set-Auswahlmöglichkeiten suchen) als Ihre echte Maschine installieren und dann die Berechtigungen mithilfe der Option chreference --reference "kopieren".

Wenn Sie sich für diese Route entscheiden, kann ich meinen Beitrag mit detaillierteren Anweisungen bearbeiten.

Es war / home, dass er mit fat32 gewechselt hat, so dass zumindest die meisten Dauerwellen keine Rolle spielen. Peter Cordes vor 14 Jahren 0
0
Peter Cordes

Ah, den harten Weg herauszufinden, den Sie mit tar zum Zurücksetzen / Wiederherstellen hätten verwenden sollen. :(

find . -type f -name '*.txt' -exec chmod -x {} +

Oder mit einem anderen Wahlschalter, z find -regextype posix-extended . -type f -iregex '.*\.(txt|css|html)' -exec chmod -x {} +

Eigentlich sollte kaum etwas in Ihrem Home-Verzeichnis ausführbar sein, also würde ich einfach mit find -type f(ohne -name) beginnen und die Dateien dann nach Bedarf ausführbar machen. Vielleicht chmod auf Modus 664, wenn Sie mit dem Modus 777 fertig sind, da Sie keine Schreibrechte für Ihre Dateien (oder Verzeichnisse) haben möchten. Chmod ow -R ~ ist also eine gute Idee.

Einige Dateien sollten nicht von anderen Benutzern auf demselben Computer gelesen werden können, z. B. ~ / .bash_history, ~ / .ssh, ~ / Mail usw. (basierend auf dem, was ich in meinem Home-Verzeichnis habe, das kann eine Rolle spielen)

 CD chmod 600 .bash_history .esd_auth .githistory .ICEauthority .lesshst .mcoprc .netrc * .pulse-cookie .wird-verwendet * .viminfo .Xauthority .xsession-errors chmod 700 .dbus .gconf * .gnome * .gnupg .icedteaplugin .kde .macromedia .metacity Mail .mozilla .openoffice.org * .pulse .purple .Skype .ssh .thumbnails .tsclient .update-notifier  chmod 2700 .gnupg # Super-Ultra-Paranoid, denke ich. chmod 500 .gvfs # gvfs ist seltsam und möglicherweise nicht auf dem aktuellen ubuntu vorhanden? 

Kopieren Sie diese in ein Terminal. Machen Sie sich keine Sorgen über Fehler. Ich bin sicher, Sie haben nicht dieselben Dotfiles und Verzeichnisse wie ich. (und ich habe eine Menge obskurer Verzeichnisse ausgelassen, die eigentlich nur Spielessicherungsverzeichnisse sind und ohne Schaden öffentlich lesbar sein könnten.) Im Allgemeinen, wenn Sie nicht möchten, dass Ihr pr0n-Vorrat oder eine Erwähnung davon in anderen Benutzern angezeigt wird. Suchen Sie nach Ergebnissen oder anderen Suchen, stellen Sie sicher, dass Ihre Verlaufsdateien usw. privat sind.