Discussion:
find und Leerzeichen in Dateinamen
(zu alt für eine Antwort)
Jörg Rolef
2010-07-30 13:19:31 UTC
Permalink
Hallo zusammen,

ich möchte bestimmte Dateien mit find zusammensuchen und sie gemeinsam
als Argumente an ein Kommando übergeben. Leider durchsuche ich ein
Windows-Verzeichnis und es gibt nach alter MS-Manier viele Leerzeichen
in den Dateinamen. Also:

cp $(find . -iname "*.xls") Zielverzeichnis

, und das erzeugte Kommando lautet dann beispielsweise

cp ./Erste Datei.xls ./Zweite Datei.xls Zielverzeichnis

, was wegen der Spaces im Dateinamen dazu führt, dass die Shell 4 zu
kopierende Dateien ausmacht und nicht finden kann.

Wie kann ich das obige Kommando verändern, dass wie gewünscht so etwas
generiert wird:

cp "./Erste Datei.xls" "./Zweite Datei.xls" Zielverzeichnis

? Das ganze unter der bash.

Ich freue mich über jeden Tipp.

Viele Grüße,
Jörg
Christian Schneider
2010-07-30 13:28:53 UTC
Permalink
Post by Jörg Rolef
ich möchte bestimmte Dateien mit find zusammensuchen und sie gemeinsam
als Argumente an ein Kommando übergeben. Leider durchsuche ich ein
Windows-Verzeichnis und es gibt nach alter MS-Manier viele Leerzeichen
cp $(find . -iname "*.xls") Zielverzeichnis
, und das erzeugte Kommando lautet dann beispielsweise
cp ./Erste Datei.xls ./Zweite Datei.xls Zielverzeichnis
, was wegen der Spaces im Dateinamen dazu führt, dass die Shell 4 zu
kopierende Dateien ausmacht und nicht finden kann.
Wie kann ich das obige Kommando verändern, dass wie gewünscht so etwas
cp "./Erste Datei.xls" "./Zweite Datei.xls" Zielverzeichnis
$ find . -iname "*.xls" -exec cp '{}' Zielverzeichnis ';' # Ungetestet
--
Linux is for people who hate Windows | Christian 'strcat' Schneider
FreeBSD is for people who hate Linux | http://www.strcat.de/
NetBSD is for people who hate OpenBSD | http://www.strcat.de/blog/
OpenBSD is for people who hate everything | http://www.strcat.de/rtfm/
Jörg Rolef
2010-07-30 13:35:19 UTC
Permalink
Hallo Christian,
Post by Christian Schneider
$ find . -iname "*.xls" -exec cp '{}' Zielverzeichnis ';' # Ungetestet
danke, das funktioniert tatsächlich.

Da haben wir uns beim Posten überschnitten - ich suche v.a. auch eine
"elegante" Lösung, die die Ausgabe von $(find ...) entsprechend
generiert und von der Shell interpretieren lässt. Ob das wohl möglich ist?

Viele Grüße,
Jörg
Thomas Rachel
2010-07-30 13:49:37 UTC
Permalink
Post by Jörg Rolef
Hallo Christian,
Post by Christian Schneider
$ find . -iname "*.xls" -exec cp '{}' Zielverzeichnis ';' # Ungetestet
danke, das funktioniert tatsächlich.
Da haben wir uns beim Posten überschnitten - ich suche v.a. auch eine
"elegante" Lösung, die die Ausgabe von $(find ...) entsprechend
generiert und von der Shell interpretieren lässt. Ob das wohl möglich ist?
Da gäbe es noch

unter GNU:
find . -iname "*.xls" -print0 | xargs -0 cp --target-directory=XYZ -v #
wenn Du -v magst

sonst:
find . -iname "*.xls" | xargs -d \\n cp --target-directory=XYZ # kann
aber sein, daß --target-directory auch ein GNUismus ist


Eleganter wäre aber:

find . -iname "*.xls" -exec cp --target-diretory=XYZ {} +


Thomas
Christian Schneider
2010-07-30 13:57:34 UTC
Permalink
Post by Jörg Rolef
Post by Christian Schneider
$ find . -iname "*.xls" -exec cp '{}' Zielverzeichnis ';' # Ungetestet
danke, das funktioniert tatsächlich.
Da haben wir uns beim Posten überschnitten - ich suche v.a. auch eine
"elegante" Lösung, die die Ausgabe von $(find ...) entsprechend
generiert und von der Shell interpretieren lässt. Ob das wohl möglich ist?
Sicher; mit ``while read...'' oder vergleichbaren Konstrukten.
Alternativ nimm die Zsh
$ setopt extendedglob
$ cp **/*.xls Zielverzeichnis
--
Linux is for people who hate Windows | Christian 'strcat' Schneider
FreeBSD is for people who hate Linux | http://www.strcat.de/
NetBSD is for people who hate OpenBSD | http://www.strcat.de/blog/
OpenBSD is for people who hate everything | http://www.strcat.de/rtfm/
Jörg Rolef
2010-07-30 13:31:34 UTC
Permalink
Hallo noch einmal,
Post by Jörg Rolef
cp $(find . -iname "*.xls") Zielverzeichnis
, und das erzeugte Kommando lautet dann beispielsweise
cp ./Erste Datei.xls ./Zweite Datei.xls Zielverzeichnis
Wie kann ich das obige Kommando verändern, dass wie gewünscht so etwas
cp "./Erste Datei.xls" "./Zweite Datei.xls" Zielverzeichnis
PS: Eine Quick-Lösung ist natürlich

find . -iname "*.xls" -exec cp "{}" Zielverzeichnis

aber ich hoffe, es gibt vielleicht einen eleganten Weg mit Mitteln der
Shell und GNU-find, welche ermöglichen, dass bei der Expansion von
$(find ...) zwischen Leerzeichen in den von find ermittelten Dateinamen
und Whitespaces, die zwischen den Dateinamen ausgegeben werden,
unterschieden werden kann.

Viele Grüße,
Jörg
Thomas Rachel
2010-07-30 13:51:10 UTC
Permalink
Post by Jörg Rolef
aber ich hoffe, es gibt vielleicht einen eleganten Weg mit Mitteln der
Shell und GNU-find, welche ermöglichen, dass bei der Expansion von
$(find ...) zwischen Leerzeichen in den von find ermittelten Dateinamen
und Whitespaces, die zwischen den Dateinamen ausgegeben werden,
unterschieden werden kann.
Selbst wenn es das gäbe - elegant ist anders, wie etwa der find-Aufruf...

Thomas
Stefan Reuther
2010-07-30 17:08:00 UTC
Permalink
Post by Jörg Rolef
Hallo noch einmal,
Post by Jörg Rolef
Wie kann ich das obige Kommando verändern, dass wie gewünscht so etwas
cp "./Erste Datei.xls" "./Zweite Datei.xls" Zielverzeichnis
PS: Eine Quick-Lösung ist natürlich
find . -iname "*.xls" -exec cp "{}" Zielverzeichnis
aber ich hoffe, es gibt vielleicht einen eleganten Weg mit Mitteln der
Shell und GNU-find, welche ermöglichen, dass bei der Expansion von
$(find ...) zwischen Leerzeichen in den von find ermittelten Dateinamen
und Whitespaces, die zwischen den Dateinamen ausgegeben werden,
unterschieden werden kann.
Der dafür vorgesehene Weg ist in erster Linie 'find -exec'. Für Leute,
die unbedingt die Ausgabe nochmal parsen wollen, gibt es dann noch
'find -print0 | xargs -0'. Wenn du nun wirklich unbedingt die Shell das
ganze nochmal parsen lassen willst, kannst du nun, GNU tools voraus-
gesetzt, 'find ... -exec ls --quoting-style=shell +' verwenden, aber für
elegant würde ich das nicht halten.


Stefan
Ulrich Gayer
2010-08-21 23:16:03 UTC
Permalink
Post by Stefan Reuther
Der dafür vorgesehene Weg ist in erster Linie 'find -exec'. Für Leute,
die unbedingt die Ausgabe nochmal parsen wollen, gibt es dann noch
'find -print0 | xargs -0'
Der Hauptvorteil des letzteren gegenüber -exec ist aber der, dass es
nicht für jede gefundene Datei einen extra "cp"-Prozess forked.
Sven Mascheck
2010-08-22 18:11:36 UTC
Permalink
Post by Ulrich Gayer
Post by Stefan Reuther
Der dafür vorgesehene Weg ist in erster Linie 'find -exec'. Für Leute,
die unbedingt die Ausgabe nochmal parsen wollen, gibt es dann noch
'find -print0 | xargs -0'
alternativ zum händischen Parsen direkt in eine Shell:
find ... -exec sh -c '...' find-sh {}
Post by Ulrich Gayer
Der Hauptvorteil des letzteren gegenüber -exec ist aber der, dass es
nicht für jede gefundene Datei einen extra "cp"-Prozess forked.
oder einfach (das mittlerweile sehr verbreitete und in diesem
Thread bereits genannte) -exec ... {} + , ggf. wieder mit Shell.
--
http://www.in-ulm.de/~mascheck/various/find/
Christian Weisgerber
2010-07-30 17:30:36 UTC
Permalink
Post by Jörg Rolef
PS: Eine Quick-Lösung ist natürlich
find . -iname "*.xls" -exec cp "{}" Zielverzeichnis
aber ich hoffe, es gibt vielleicht einen eleganten Weg mit Mitteln der
Shell und GNU-find, welche ermöglichen, dass bei der Expansion von
$(find ...) zwischen Leerzeichen in den von find ermittelten Dateinamen
und Whitespaces, die zwischen den Dateinamen ausgegeben werden,
unterschieden werden kann.
Nein. Shell ist eine Textersetzungssprache und ein Leerzeichen in
einer Zeichenkette ist ein Leerzeichen in einer Zeichenkette, egal
woher es ursprünglich stammt.

Wenn in den Dateinamen keine Newlines vorkommen, dann geht sowas:

oIFS=$IFS
IFS='
'
cp $(find . -iname "*.xls") Zielverzeichnis
IFS=$oIFS
--
Christian "naddy" Weisgerber ***@mips.inka.de
Loading...