8schpi
Goto Top

Linux Bash - Find Ausgabe an Expr übergeben

Ich habe ein kleines Problem in der Shell. Ich möchte die Ausgabe von 'find /' an den Befehl 'expr length' übergeben.

Linux auf einem Qnap 219P, Zugriff per ssh.

Ich möchte gerne feststellen, ob ich Dateinamen auf meinem System habe, die länger als z.B. 240 Zeichen sind. Ich meine das müsste mit einer Zeile in der Shell unter Linux funktionieren.
Der Befehl
find /
listet alle Dateinamen inkl. Pfade auf. Der Befehl
expr length "Hallo Welt"  
gibt die Länge 10 aus.
Wenn beide Befehle verknüpft wären hatte man schon eine Liste der Längen der Dateinamen.
Die Verknüpfung der Befehle müsste meiner Meinung nach so aussehen:
find / | expr length
Leider funktioniert das so nicht. Weiß jemand warum?
Google erschlägt mich mit Erklärungen, aber ich finde den Haken nicht.
Danke für einen Tipp.

Content-ID: 131676

Url: https://administrator.de/forum/linux-bash-find-ausgabe-an-expr-uebergeben-131676.html

Ausgedruckt am: 23.12.2024 um 06:12 Uhr

lexa-lexa
lexa-lexa 14.12.2009 um 20:58:03 Uhr
Goto Top
Zitat von @8schpi:
Leider funktioniert das so nicht. Weiß jemand warum?
"Hallo Welt" ist ein String, das Ergebnis von find / ist aber eine *Liste* von Strings.

Du kannst "find" die einzelnen Dateinamen an "Expr" übergeben lassen:

tuxbox:~ # find / -print -exec expr length {} \;

Gib das so in der shell ein, dann erhältst du Datei- und Ordnernamen und deren Länge auf der folgenden Zeile. Beachte den "\" vor dem Semikolon. In {} setzt find das Argument, siehe man 1 find.

Wenn du nur Dateien prüfen willst, musst du "-type f" ergänzen.

tuxbox:~ # find / -type f -print -exec expr length {} \;
8schpi
8schpi 15.12.2009 um 17:56:39 Uhr
Goto Top
Hallo lexa-lexa,
die Befehlsfolge sieht gut aus. Leider klappt aber irgendwas noch nicht. Die Ausgabe ist wie folgt:
[~] # find / -print -exec expr length {} \;
BusyBox v1.01 (2009.10.13-20:23+0000) multi-call binary

Usage: find [PATH...] [EXPRESSION]

Search for files in a directory hierarchy.  The default PATH is
the current directory; default EXPRESSION is '-print'  

EXPRESSION may consist of:
        -follow         Dereference symbolic links.
        -name PATTERN   File name (leading directories removed) matches PATTERN.
        -print          Print (default and assumed).

        -type X         Filetype matches X (where X is one of: f,d,l,b,c,...)
        -perm PERMS     Permissions match any of (+NNN); all of (-NNN);
                        or exactly (NNN)
        -mtime TIME     Modified time is greater than (+N); less than (-N);
                        or exactly (N) days

Die Ausgabe nur der Kurzbeschreibung des Befehls deutet auf einen Syntaxfehler hin, oder? Ich finde ihn leider nicht…
lexa-lexa
lexa-lexa 15.12.2009 um 18:24:32 Uhr
Goto Top
Dann ist "find" in deiner BusyBox unvollständig implementiert. Dann musst du also einen anderen Weg gehen, z.B. über ein Shell-Script.

#!/bin/sh

find / > dateiliste.txt

while read DATEINAME ; do
   echo "$(expr length $DATEINAME) $DATEINAME" >> dateiliste2.txt  
done < dateiliste.txt

sort -n dateiliste2.txt > dateiliste.txt
rm dateiliste2.txt
cat dateiliste.txt
8schpi
8schpi 16.12.2009 um 22:11:44 Uhr
Goto Top
Hallo lexa-lexa,
das ist so ziemlich genau das was ich suche. Sehr vielen Dank für die Unterstützung.

Ein Problem bleibt allerdings:
Sobald ein Leerzeichen im Dateinamen auftaucht erscheint eine Fehlermeldung in der Shell und die Länge des Dateinamens wird nicht berechnet / angezeigt.

Bis auf einen Punkt kann ich das Skript nachvollziehen:

1. Warum gibt es ein Problem mit Leerzeichen in den Zeilen? (In der Manpage von read habe ich leider keinen Hinweis gefunden.)

Die Option '-r' des Befehls 'read' führt nicht zur Lösung.
6890
6890 17.12.2009 um 10:32:04 Uhr
Goto Top
Hallo,

probier doch mal
find ./ | xargs -I "{}" expr length {}

sollte klappen.

MfG
lexa-lexa
lexa-lexa 17.12.2009 um 16:06:42 Uhr
Goto Top
Hi,

setze einfach beide $DATEINAME in Anf.-zeichen:
echo "$(expr length "$DATEINAME") "$DATEINAME"" >> dateiliste2.txt  

Das Problem besteht darin, dass ein Dateiname mit Leerzeichen für expr wie mehrere Parameter aussehen:

expr length datei name nummer eins
statt
expr length "datei name nummer eins"
8schpi
8schpi 18.12.2009 um 20:30:25 Uhr
Goto Top
Hallo,
leider funktioniert es noch nicht.

@ godlike P: der find Befehl ist in der Umgebung leider nicht vollständig implementiert. Deshalb funktioniert die Nummer mit {} nicht (siehe auch Posts weiter oben).

@ lexa-lexa: Die zusätzlichen Anführungszeichen helfen leider noch nicht. Ich vermute mal, dass jetzt der Befehl echo vor $Dateiname schon 'dichtmacht'. Die anderen Anführungszeichen (') habe ich auch schon ausprobiert. Bei beiden Varianten kommt eine Liste von Pfaden und Dateinamen ohne Angabe der Dateinamenslänge raus.

Hat noch jemand einen Tipp, wie ich das zum laufen bekommen kann? Danke.