• Willkommen im Linux Club - dem deutschsprachigen Supportforum für GNU/Linux. Registriere dich kostenlos, um alle Inhalte zu sehen und Fragen zu stellen.

chmod $verzeichnisname verzeichnisname???

Azhrarn

Newbie
Hi Forum!

Ich möchte den Besitzer eines Verzeichnisses mit chmod ändern. Genauer gesagt viele Verzeichnisse. Der Besitzer soll genauso heissen wie das Verzeichnis.

Code:
#drwxr-xr-x besitzer gruppe verzeichnisname
z.B:
#drwxr-xr-x root       users    klaus
#drwxr-xr-x root       users    peter
#drwxr-xr-x root       users    gabi
soll zu
#drwxr-xr-x klaus       users    klaus
#drwxr-xr-x peter       users    peter
#drwxr-xr-x gabi         users    gabi

Hat da jemand eine Lösung für mich?
 

regexer

Advanced Hacker
Azhrarn schrieb:
Hat da jemand eine Lösung für mich?
Code:
for dir in klaus peter gabi
do
  chown $dir $dir
done
Die verzeichninamen "klaus peter gabi" liesen sich auch durch einen entsprechenden find ersetzen. Siehe hierzu
Code:
man find
 
OP
A

Azhrarn

Newbie
Ich habe mir ein Skript erstellt das folgendermaßen aussieht:

Code:
#! /bin/bash

for dir in find /home/XXXXX -maxdepth 1 -printf %P\ 
do
   chown $dir $dir
done

leider bekomme ich folgende Meldung:
line 5: syntax error near unexpected token 'chown'
line 5: 'chown $dir $dir'

Wo liegt mein Fehler?
 

regexer

Advanced Hacker
Azhrarn schrieb:
Code:
for dir in find /home/XXXXX -maxdepth 1 -printf %P\ 
do
Ich würde den find in Backticks setzen.
Außerdem ist wahrscheinlich das hier passender:
Code:
for dir in `find /home -type d -maxdepth 1 | tail +2`
do
  echo chown `basename $dir` $dir
done
Einige Erklärungen:
- der find sucht nach Verzeichnissen in /home
- der tail +2 löscht die erste Zeile, da dies das Verzeichnis /home selbst ist
- den basename braucht man, um das Verzeichnis ohne Pfad zu erhalten
- der echo ist zur Sicherheit. Wenn man sich sicher ist, kann man ihn entfernen.
 

TeXpert

Guru
zusätzlich wird das mit dem %P in die Hose gehen, denn für das Verzeichnis brauchst Du den Pfad und für den Owner nur den Namen.

dann, was soll der Backslash? zusätzlcih bruachen wir für die for-Schleife eine Reihe von Eingaben, die durch Separatoren getrennt sind, d.h. ein
Code:
-printf "%P\n"
wäre im Prinzip sinnvoller (ich würde mit %f arbeiten, egal) aber das reicht ja nicht, da wir uns ja nicht in dem Basisverzeichnis befinden müssen -> chown schlägt fehl.

hehe, um jetzt die Idee von notoxp noch zu toppen (ich spare mir die Pipe und den call von tail) schlage ich das hier vor:

Code:
for dir in $(find /home/ -mindepth 1 -maxdepth 1 -type d )
do
      chown $(basename $dir) $dir
done

durch maxdepth gehen wir nicht tiefer und durch mindepth wird das Verzueichnis /home/ ausgeschlossen (das ist Ebene 0)
 

regexer

Advanced Hacker
TeXpert schrieb:
hehe, um jetzt die Idee von notoxp noch zu toppen
[...]durch maxdepth gehen wir nicht tiefer und durch mindepth wird das Verzueichnis /home/ ausgeschlossen (das ist Ebene 0)
Nicht schlecht. Ich lasse mich gerne toppen. Man lernt ja schließlich nie aus.
 

TeXpert

Guru
und wenn wir jetzt noch, wie auch hier: http://www.linux-club.de/viewtopic.php?t=41947 von haveaniceday vorgeschlagen die Bash-String Ersetzung nutzen, kann man das auch so:

Code:
for dir in $(find /home/ -mindepth 1 -maxdepth 1 -type d )
do
    echo "  chown ${dir##*/} $dir"
done

machen, dann sparen wir noch die n-Aufrufe von basename (ok, geht nur mit Bash aber egal :) )
 

regexer

Advanced Hacker
TeXpert schrieb:
machen, dann sparen wir noch die n-Aufrufe von basename (ok, geht nur mit Bash aber egal :) )
Offensichtlich gibt es den max-/mindepth auch noch nicht so lange beim find. Auf Unixware gibt es diese Parameter zum Beispiel gar nicht.

Ich glaube, mitlerweile es kann ziemlich schwierig sein, abwärtskompatibel zu scriptieren. Darüber könnte man ein Buch schreiben.
 

TeXpert

Guru
jepp, Kompatible scripten sind immer ein Problem, aber zusammen mit der GNUCompiler Chain sollten sich auch unter unixware die GNU Tools kompilieren lassen...

d.h. Du kannst an sich schon portabel für die GNU Tools scripten...


BTW: hier läuft
Code:
$ find --version
GNU find Version 4.1.20
 
Oben