Top-Themen

Aktuelle Themen (A bis Z)

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

gelöst Shellscript-Problem mit Leerzeichen im Dateinamen

Mitglied: KHP

KHP (Level 1) - Jetzt verbinden

27.10.2007, aktualisiert 28.10.2007, 32150 Aufrufe, 9 Kommentare

Dateien verschieben mit FOR-Schleife

Hallo miteinander,

ich habe mir ein kleines Shellscript geschrieben das über einen cronjob regelmäßig gestartet wird. Es soll mir lediglich Dateien, wenn vorhanden, in ein anderes Verzeichnis schieben.

#!/bin/sh

for FILE in `ls -1 /home/comeIn`
#(Alternative1): for FILE in `ls -1 --quoting-style=shell /home/comeIn`
#(Alternative2): for FILE in $(ls -1 /home/comeIn)
do
echo "/home/comeIn: verschiebe" $FILE "--> /home/me/incoming"
mv /home/comeIn/$FILE /home/me/incoming/$FILE
done
Die Ausgabe des Scripts wird mir dann als Mail zugeschickt (macht der cronjob automatisch).

Theoretisch bräuchte ich diese Schleife nicht, allerdings werden mir dann immer Fehlermeldungen per Mail geschickt, die mir andauernd erzählen dass da keine Datei ist. Der Sinn der Sache ist aber der umgekehrte, ich möchte nur Mails bekommen wenn Dateien da und verschoben sind!

Soviel zur Aufgabenstellung. Das eigentliche PROBLEM an der Sache ist, dass das Script über Dateien stolpert die Leerzeichen im Dateinamen haben. Die einzelnen Textteile der Dateinamen werden als einzelne Dateien behandelt und ich werde mit Fehlermeldungen bombardiert. Übrigens schaffen auch die angegebenen Alternativen das gleiche Ergebnis.

Wie verklickere ich der FOR-Schleife, dass der Inhalt FILE-Variable die komplette Zeile der ls-Ausgabe sein soll???
Oder gibt es noch komplett andere Ansätze dafür?

Vielleicht kann mir da jemand helfen... Vielen Dank - Tobias
Mitglied: Biber
27.10.2007 um 18:16 Uhr
Moin KHP,

das sollte in der bash genauso funktionieren wie unter M$'s CMD-Shell: den kompletten Pfad incl. $FILE in Anführungszeichen einschließen.
01.
mv "/home/comeIn/$FILE" "home/me/incoming/$FILE"
Anmerkung: statt "-quoting-style" kannst Du auch einfach "-b" schreiben.

Alternativ kannst Du natürlich die Leerzeichen im Namen "maskieren", d.h. jedes Leerzeichen durch die Sequenz Backslash-Leerzeichen ersetzen.
01.
sed -e 's/\ /\\\ /g'
Nötig ist das nicht, aber wenn Du grad am Skripten-Üben bist...

Grüße
Biber
Bitte warten ..
Mitglied: KHP
27.10.2007 um 18:31 Uhr
Hi Biber,

das mit den Anführungszeichen hilft da leider nicht weiter, weil die FOR-Schleife für einen Dateinamen mit Leerzeichen zweimal durchlaufen wird. Beispiel:

Dateiname: "meine Datei.txt"
mv-Befehl 1. Durchlauf: mv /home/comeIn/meine /home/me/incoming/meine
mv-Befehl 2. Durchlauf: mv /home/comeIn/Datei.txt /home/me/incoming/Datei.txt

Der mv-Befehl klagt dann natürlich über nicht vorhandene Dateien.

Das mit dem Maskieren hab ich nicht so recht kapiert...wie funktioniert denn das?

Tobias
Bitte warten ..
Mitglied: Biber
28.10.2007 um 01:19 Uhr
Moin KHP,

sorry, ich hab jetzt grad kein richtiges OS hier zum Testen.
Dennoch, eigentlich sollte es so funktionieren:
01.
#!/bin/sh 
02.
 
03.
for FILE in `ls -b /home/comeIn` 
04.
do 
05.
echo "/home/comeIn: verschiebe" $FILE "--> /home/me/incoming" 
06.
mv "/home/comeIn/$FILE" "/home/me/incoming/$FILE" 
07.
done
Die zweite Frage - sed und regular expressions lassen wir erstmal noch links liegen.
Nur kurz: Ziel soll ja sein, in dem String "Dateiname mit Leerzeichen.bla" alle Leerzeichen zu "maskieren", d.h. der Shell mitzuteilen, dass dieses Leerzeichen halt "einfach nur Buchstabe" ist, auch wenn er sonst anders interpetiert werden würde. Z.B. als Wortende.

01.
sed -e 's/\ /\\\ /g'
...bedeutet also nur: Ersetze alle Zeichen "Leerzeichen" ( ="/\ ") durch "Backslash-Leerzeichen".
Und in diesem Ersatz-String ist nun auch ausgerechnet ein spezielles Zeichen (Backslash), das selbst maskiert werden muss-
Daher sieht der Ersatzstring etwas strange aus: "/\\\ " . Heißt aber nur: Ersetze mit "einem Backslash und einem Leerzeichen".
Näheres dazu bei "man sed" oder "man regular expression".

Gruss
Biber
Bitte warten ..
Mitglied: KHP
28.10.2007 um 10:58 Uhr
Tach Biber,

hab das Script original so mal ausprobiert. Es funktioniert auch eigentlich, nur die Leerzeichen machen Probleme ;o)
Spass beiseite, es hat sich nix geändert. Ich werde mich mal ausgiebig mit dieser Maskiererei, sprich mit dem "sed"-Befehl beschäftigen und melde mich dann wieder.

So ein winziges Script kann doch manchmal mehr Arbeit verursachen als man denkt...

Schönen Sonntag noch - Tobias

p.s. da fällt mir ein, es gibt die ls-Option "--quoting-style=escape" da wird ein Leerzeichen immer mit einem Backslash "\" begonnen...is aber immer noch eins drin. Könnte das bei dem Maskieren weiterhelfen? (nur so 'ne Idee, kann mit "escape" halt nix anfangen)
Bitte warten ..
Mitglied: unbenannt
28.10.2007 um 22:21 Uhr
Hallo,

#!/bin/sh

for FILE in `ls -1 /home/comeIn`
#(Alternative1): for FILE in `ls -1
--quoting-style=shell /home/comeIn`
#(Alternative2): for FILE in $(ls -1
/home/comeIn)
do
echo "/home/comeIn: verschiebe"
$FILE "--> /home/me/incoming"
mv /home/comeIn/$FILE
/home/me/incoming/$FILE
done

das Problem ist, dass die for-Schleife schon nur die "zerstückelten" Namen zu Gesicht bekommt.

Eine Lösung wäre statt einer for-Schleife eine while-Schleife zu benutzen.

ls -1 /home/comeIn | while read FILE do
mv -f /home/comeIn/"$FILE" /home/me/incomming/
done

Cheers!
Bitte warten ..
Mitglied: KHP
28.10.2007 um 23:45 Uhr
Hey,

na super, das funktioniert!

01.
#!/bin/sh 
02.
ls -1 /home/comeIn | while read FILE 
03.
do 
04.
mv -f /home/comeIn/"$FILE" /home/me/incomming/ 
05.
done
Hab noch mein echo dazwischengebaut und nix mehr mit Fehlermeldungen...
...gaanz großes DANKE auch!!!
Bitte warten ..
Mitglied: CustomCoder
14.01.2010 um 18:40 Uhr
versucht doch mal:

winky@T61:~$ ./script.sh BLAN\ K/ 
BLAN K//foo bar 
-rw-r--r-- 1 winky winky 0 2010-01-14 18:44 BLAN K//foo bar 
BLAN K//foo_bar 
-rw-r--r-- 1 winky winky 0 2010-01-14 19:00 BLAN K//foo_bar 
winky@T61:~$ cat script.sh  
#!/bin/bash 
 
PFAD="$1" 
 
for FILE in "$PFAD"/* 
do 
	echo "$FILE" 
	ls -l "$FILE" 
done
das fängt leerzeichen im pfad und dateinamen ab. außerdem braucht man für ne for kein ls, kost nur performance.
die while mag funzen, hat aber den nachteil, dass man wieder n ls machen muss und außerdem öffnet man durch die pipe ne subshell. d.h. beschreibst du in der while ne variable, ist die außerhalb nicht mehr verfügbar.
Bitte warten ..
Mitglied: unbenannt
15.01.2010 um 09:08 Uhr
while ist nicht die schnellste möglichkeit, aber die sicherere! bei der for schleife gibt es probleme wenn zu viele dateien vorhanden sind. wenn "$PFAD"/* zu mehr als 32K zeichen expandiert werden soll gibt es eine fehlermedlung und nichts passiert. diese einschränkung wird bei den for schleifen nie erwähnt.
Bitte warten ..
Mitglied: AlexHam
20.03.2017 um 16:43 Uhr
Hier mal mein praktisches Beispiel, bei dem ich eine Auflistung von tif-Dateien in der KornShell von einem Windows-Netzwerkpfad in ein Arbeitsverzeichnis kopieren will:

#!/bin/sh

#Windows-Pfad zum Share auf dem Fileserver
DTAUSPATH='//fsnt-01-nl/ver_r$/11 SKS/27 IDEAL Antraege/Eingang_TEST'
DATEIART=*.tif
DATPATH=D:\Batch\IDEAL

  1. wie oben bereits gesehen:
ls -1 "$DTAUSPATH"/$DATEIART | while read DATEI
do
echo DATEI: "$DATEI"
cp -fv "$DATEI" $DATPATH
done

Und siehe da, die Leerzeichen sind im Netzwerkpfad kein Problem mehr.
Bitte warten ..
Ähnliche Inhalte
Batch & Shell

Batch: doppeltes Leerzeichen in Dateinamen?

gelöst Frage von WoswaasiBatch & Shell3 Kommentare

Hallo! Wir verarbeiten bei uns in der Arbeit Audio-Dateien, die über Nacht in 5-Minuten-Abschnitte gesplittet werden. Ich habe dafür ...

Batch & Shell

Leerzeichen aus Dateinamen entfernen

gelöst Frage von noob-xBatch & Shell3 Kommentare

Hallo Profis, ich möchte bei vielen Dateien in einem Ordner die Leerzeichen aus den Dateinamen entfernen Dateien sehen so ...

Batch & Shell

Dateinamen mit Leerzeichen mit xcopy in einer Variable kopieren

gelöst Frage von chainsawBatch & Shell8 Kommentare

Hallo Gemeinde, Für euch bestimmt ein banales Problem: Ich möchte mit folgendem Script aus einem bestimmten Ordner alle Dateien ...

Batch & Shell

Leerzeichen, Sonderzeichen in Dateinamen lassen Batch crashen

Frage von Domain-JaneBatch & Shell3 Kommentare

Hallo zusammen, hier meine Frage zum Sonntag ;): Mit dem Dir-Befehl lasse ich mir eine Datei erzeugen, indem Pfad+Dateinamen ...

Neue Wissensbeiträge
Google Android

Googles "Android Enterprise Recommended" für Unternehmen

Information von kgborn vor 2 StundenGoogle Android

Hier eine Information, die für Administratoren und Verantwortliche in Unternehmen, die für die Beschaffung und das Rollout von Android-Geräten ...

Sicherheit

Intel gibt neue Spectre V2-Microcode-Updates frei (20.02.2018)

Information von kgborn vor 2 StundenSicherheit

Intel hat zum 20. Februar 2018 weitere Microcode-Updates für OEMs freigegeben, um Systeme mit neueren Prozessoren gegen die Spectre ...

Microsoft
ARD-Doku - Das Microsoft Dilemma
Tipp von Knorkator vor 6 StundenMicrosoft2 Kommentare

Hallo zusammen, vor einigen Tagen lief in der ARD u.a. Reportage. Das Youtube Video dazu dürfte länger verfügbar sein. ...

Windows 10

Neue Sicherheitslücke in Windows 10 (Version 1709) durch Google öffentlich geworden

Information von kgborn vor 1 TagWindows 10

Vor ein paar Tagen haben Googles Sicherheitsforscher vom Projekt Zero eine Sicherheitslücke im Edge-Browser publiziert. Jetzt wurde eine weitere ...

Heiß diskutierte Inhalte
Windows Server
AD DS findet Domäne nicht, behebbar?
Frage von schapitzWindows Server36 Kommentare

Guten Tag, ich habe bei einem Kunden ein Problem mit den AD DS. Umgebung ist folgende: Windows Server 2016 ...

Router & Routing
LANCOM VPN CLIENT einrichten
Frage von Finchen961988Router & Routing27 Kommentare

Hallo, ich habe ein Problem und hoffe ihr könnt mir helfen, wir haben einen Kunden der hat einen Speedport ...

CPU, RAM, Mainboards
32 gb RAM zu wenig?
Frage von pcguyCPU, RAM, Mainboards13 Kommentare

Hallo zusammen, mein PC verfügt über 32GB Ram. Nun kriege ich bei grossen Dateien im Illustrator die Fehlermeldung das ...

Router & Routing
ISC DHCP 2 Subnetze
gelöst Frage von janosch12Router & Routing11 Kommentare

Hallo, ich betreibe bei mir im Netzwerk einen ISC DHCP Server auf Debian, der DHCP verwaltet aktuell ein /24 ...