Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

"Argument list too long" auf embedded Sytem

1 view
Skip to first unread message

Thorsten Steinbrenner

unread,
Oct 3, 2008, 4:52:53 AM10/3/08
to
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...

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)

Juergen Ilse

unread,
Oct 3, 2008, 5:31:02 AM10/3/08
to
Hallo,

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 ...

Markus Steinborn

unread,
Oct 3, 2008, 5:39:23 AM10/3/08
to
Hallo Juergen,

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

Michael Mauch

unread,
Oct 3, 2008, 6:40:04 AM10/3/08
to
Thorsten Steinbrenner wrote:

> 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

Norbert Möndjen

unread,
Oct 3, 2008, 8:20:56 AM10/3/08
to
Markus Steinborn wrote:

>> 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

Christoph Federer

unread,
Oct 3, 2008, 9:41:53 AM10/3/08
to
Thorsten Steinbrenner schrieb:

> 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)

Thorsten Steinbrenner

unread,
Oct 5, 2008, 9:32:47 AM10/5/08
to
Michael Mauch schrieb:

> 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

Thorsten Steinbrenner

unread,
Oct 5, 2008, 10:06:49 AM10/5/08
to
Christoph Federer schrieb:

> $ 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

Sven Mascheck

unread,
Oct 7, 2008, 6:35:32 PM10/7/08
to
Thorsten Steinbrenner wrote:

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

Thorsten Steinbrenner

unread,
Oct 8, 2008, 11:10:19 AM10/8/08
to
Sven Mascheck schrieb:

> [...]


> 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

0 new messages