Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Linux Bash - Find Ausgabe an Expr übergeben

Frage Linux

Mitglied: 8schpi

8schpi (Level 1) - Jetzt verbinden

14.12.2009 um 19:08 Uhr, 7375 Aufrufe, 7 Kommentare

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
01.
find /
listet alle Dateinamen inkl. Pfade auf. Der Befehl
01.
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:
01.
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.
Mitglied: lexa-lexa
14.12.2009 um 20:58 Uhr
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:

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

01.
tuxbox:~ # find / -type f -print -exec expr length {} \;
Bitte warten ..
Mitglied: 8schpi
15.12.2009 um 17:56 Uhr
Hallo lexa-lexa,
die Befehlsfolge sieht gut aus. Leider klappt aber irgendwas noch nicht. Die Ausgabe ist wie folgt:
01.
[~] # find / -print -exec expr length {} \; 
02.
BusyBox v1.01 (2009.10.13-20:23+0000) multi-call binary 
03.
 
04.
Usage: find [PATH...] [EXPRESSION] 
05.
 
06.
Search for files in a directory hierarchy.  The default PATH is 
07.
the current directory; default EXPRESSION is '-print' 
08.
 
09.
EXPRESSION may consist of: 
10.
        -follow         Dereference symbolic links. 
11.
        -name PATTERN   File name (leading directories removed) matches PATTERN. 
12.
        -print          Print (default and assumed). 
13.
 
14.
        -type X         Filetype matches X (where X is one of: f,d,l,b,c,...) 
15.
        -perm PERMS     Permissions match any of (+NNN); all of (-NNN); 
16.
                        or exactly (NNN) 
17.
        -mtime TIME     Modified time is greater than (+N); less than (-N); 
18.
                        or exactly (N) days
Die Ausgabe nur der Kurzbeschreibung des Befehls deutet auf einen Syntaxfehler hin, oder? Ich finde ihn leider nicht…
Bitte warten ..
Mitglied: lexa-lexa
15.12.2009 um 18:24 Uhr
Dann ist "find" in deiner BusyBox unvollständig implementiert. Dann musst du also einen anderen Weg gehen, z.B. über ein Shell-Script.

01.
#!/bin/sh 
02.
 
03.
find / > dateiliste.txt 
04.
 
05.
while read DATEINAME ; do 
06.
   echo "$(expr length $DATEINAME) $DATEINAME" >> dateiliste2.txt 
07.
done < dateiliste.txt 
08.
 
09.
sort -n dateiliste2.txt > dateiliste.txt 
10.
rm dateiliste2.txt 
11.
cat dateiliste.txt
Bitte warten ..
Mitglied: 8schpi
16.12.2009 um 22:11 Uhr
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.
Bitte warten ..
Mitglied: 6890
17.12.2009 um 10:32 Uhr
Hallo,

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

sollte klappen.

MfG
Bitte warten ..
Mitglied: lexa-lexa
17.12.2009 um 16:06 Uhr
Hi,

setze einfach beide $DATEINAME in Anf.-zeichen:
01.
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"
Bitte warten ..
Mitglied: 8schpi
18.12.2009 um 20:30 Uhr
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.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(4)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Windows Server
WDS mit PXE Linux (3)

Frage von HansWurstAugust zum Thema Windows Server ...

Linux Tools
Docker - Minimize your containers with alpine linux

Link von Sheogorath zum Thema Linux Tools ...

Monitoring
System Monitoring für Windows, Linux (5)

Frage von manuelw zum Thema Monitoring ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (17)

Frage von Unwichtig zum Thema Netzwerkmanagement ...