Ich habe eine groᅵe Menge Daten (incl. Dateien mit Leer- und
Sonderzeichen) auf einen NAS-Server (Linux mit busybox) kopiert. Die
Besitzer und Rechte stimmten nicht, also wollte ich das kurz mit
$ find . -type d -print0 | xargs -0 chmod ....
ᅵndern. Dummerweise kennt das find dieser Kiste kein "-print0" (und auch
kein "find -exec"), was ich aber fᅵr Dateinamen mit Leer- und
Sonderzeichen benᅵtigen wᅵrde. Grrrr...
Zweiter Versuch dann mit einem Shellskript:
#!/bin/sh
for file in "$( find . -type d )"
do
chmod ...
chown ...
done
Dieses Skript bricht mit einem "Argument list too long" ab. Jetzt weiss
ich nicht mehr weiter.... :-(
Gesucht ist ein Skript, das durch einen groᅵen Verzeichnisbaum iteriert
(incl. Dateien mit Leer- und Sonderzeichen) und entsprechend Rechte und
Besitzer von Dateien/Verzeichnissen ᅵndern kann, ohne die Verwendung von
"find -print0" bzw. "xargs -0", da diese nicht vorhanden sind.
Kᅵnnte mir bitte jemand auf die Sprᅵnge helfen? Danke!!
--
Thorsten
Es besteht die Mᅵglichkeit daᅵ Computer einmal weniger als
1,5 Tonnen wiegen (Aus "Popular Mechanics", 1949)
Thorsten Steinbrenner <ne...@billroth.de> wrote:
> Zweiter Versuch dann mit einem Shellskript:
>
> #!/bin/sh
>
> for file in "$( find . -type d )"
Damit faengst du dir wieder die Probleme mit whitespace im Dateinamen
ein ... Wie waere es statt dessen mit:
for file in *; do ...
... und dann ggfs. im Body der Schleife pruefen, ob es sich um ein
Verzeichnis handelt ...
Tschuess,
Juergen Ilse (jue...@usenet-verwaltung.de)
--
Ein Domainname (auch wenn er Teil einer Mailadresse ist) ist nur ein Name,
nicht mehr und nicht weniger ...
On Fri, 3 Oct 2008, Juergen Ilse wrote:
> Thorsten Steinbrenner <ne...@billroth.de> wrote:
>> for file in "$( find . -type d )"
> Wie waere es statt dessen mit:
>
> for file in *; do ...
>
> ... und dann ggfs. im Body der Schleife pruefen, ob es sich um ein
> Verzeichnis handelt ...
Du hast schon gemerkt, dass im Vergleich zu dem Befehl des OPs die
Rekursivitᅵt fehlt?
Grᅵᅵe
Markus
> Zweiter Versuch dann mit einem Shellskript:
>
> #!/bin/sh
>
> for file in "$( find . -type d )"
> do
> chmod ...
> chown ...
> done
>
> Dieses Skript bricht mit einem "Argument list too long" ab.
An welcher Stelle? Enthalten die ... vielleicht ein "$file"/*, so dass
dieser * zu einer zu langen Liste expandiert?
Evtl. kennt Deine busybox auch den Schalter -R fᅵr chmod und chown.
Michael
>> Wie waere es statt dessen mit:
>>
>> for file in *; do ...
>>
>> ... und dann ggfs. im Body der Schleife pruefen, ob es sich um ein
>> Verzeichnis handelt ...
>
> Du hast schon gemerkt, dass im Vergleich zu dem Befehl des OPs die
> Rekursivität fehlt?
>
Wenn ich prüfe ob es sich um ein Verzeichnis handelt ist der Gedanke ja nicht abwegig das Script in diesem Verzeichnis noch mal aufzurufen.
Ciao Nobbe
> Hallo!
>
> Ich habe eine gro�e Menge Daten (incl. Dateien mit Leer- und
> Sonderzeichen) auf einen NAS-Server (Linux mit busybox) kopiert. Die
> Besitzer und Rechte stimmten nicht, also wollte ich das kurz mit
>
> $ find . -type d -print0 | xargs -0 chmod ....
>
> �ndern. Dummerweise kennt das find dieser Kiste kein "-print0" (und auch
> kein "find -exec"), was ich aber f�r Dateinamen mit Leer- und
> Sonderzeichen ben�tigen w�rde. Grrrr...
Wie w�r's mit
$ find . -type d| while read Line; do chmod ... "$Line"; ... ; done
Gr��e
Christoph
--
Ich bin ein Wikipedianer - http://de.wikipedia.org (Fedi)
> An welcher Stelle? Enthalten die ... vielleicht ein "$file"/*, so dass
> dieser * zu einer zu langen Liste expandiert?
Ja! "chmod 755 $file". Das wurde ja schon oft durchgekaut, allerdings
verstehe ich noch immer nicht ganz, warum der Schleifenkörper nicht für
jede Datei einzeln durchlaufen wird?!
> Evtl. kennt Deine busybox auch den Schalter -R für chmod und chown.
Kennt es. Allerdings muss ich zwischen Datei und Verzeichnis differenzieren.
Grüße,
--
Thorsten
Es besteht die Möglichkeit daß Computer einmal weniger als
> $ find . -type d| while read Line; do chmod ... "$Line"; ... ; done
Danke! Das scheint zu klappen. Ich habe es jetzt mal so gemacht:
#/bin/sh
find . | while read Line
do
if [ -d "$Line" ]
then
chmod 777 "$Line"
chown ts:everyone "$Line"
echo "Dir: $Line"
elif [ -f "$Line" ]
then
chmod 766 "$Line"
chown ts:everyone "$Line"
#echo "File: $Line"
fi
done
Das ist zwar furchtbar laaaaangsam aber funktioniert! Ich habe zwar
keine Dateien mit CR im Dateinamen, aber theoretisch wäre das doch
zulässig, oder? Damit würde es dann nicht mehr funktionieren nehme ich an?
Danke Euch!
Grüße,
--
Thorsten
Es besteht die Möglichkeit daß Computer einmal weniger als
> find . | while read Line
> Ich habe zwar keine Dateien mit CR im Dateinamen, aber theoretisch
> wäre das doch zulässig, oder?
Selbst das wäre kein Problem dank
$ find . ! -name '*
*' ! -name '.*
*' [...]
(und die problematisch Einträge dann von Hand bearbeiten.)
Bei find Varianten, die (gemäß POSIX) patternmatching statt filename
expansion durchführen, ist der zweite Teil oben (für Dateien mit führenden .)
übrigens nicht notwendig. Busybox ist hier m.W. aber noch traditionell.
Sollten die problematischen Einträge allerdings so zahlreich sein,
daß man sie auch automatisiert (aber eben ohne -exec) verarbeiten
wollte, könnte man das mit Gewalt erschlagen [1] - vorausgesetzt
awk(1) ist vorhanden.
Da Leerzeichen ausdrücklich erwähnt wurden, sollte man vorsichtshalber
[...] while IFS= read
für abschließende Leerzeichen und vielleict auch noch
[...] while IFS= read -r
für abschließende \ einsetzen. (Und benötigt man IFS in der
Schleife, muß man es außen wegsichern und innen wieder setzen.)
[1] m.W. Autor Stéphane Chazelas:
eval "set '`
find .//. -print |
sed "s/'/'\\\\''/g" |
awk '
{printf "%s", /\/\// ? "'"' '"'" substr($0, 4) : "\n" $0}
END {print "'\''"}
'`"
shift
for i
do
[...]
done
Methode: Schließe die Namen in ' ein; somit sind Newlines automatisch
geschützt. Verfüttere sie an set und diese Argumente dann an
eine Schleife. (Namen die selbst ein ' enthalten, müssen deswegen
extra geschützt werden.)
> [...]
> Methode: Schließe die Namen in ' ein; somit sind Newlines automatisch
> geschützt. Verfüttere sie an set und diese Argumente dann an
> eine Schleife. (Namen die selbst ein ' enthalten, müssen deswegen
> extra geschützt werden.)
Ah, ok, ich verstehe. Vielen Dank für die ausführliche Erklärung! Ich
dachte, ich wäre ein wenig fit mit der Bash, aber jetzt habe ich doch
wieder reichlich dazugelernt... Ich liebe das Usenet... ;-)
Viele Grüße,
--
Thorsten
Mache alles so einfach wie möglich, doch nicht einfacher.
-- Albert Einstein