Schrift
[thread]9750[/thread]

mal wieder Frage wegen "find"



<< >> 5 Einträge, 1 Seite
format_c
 2005-02-19 14:30
#95262 #95262
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Hi,
habe mal wieder etwas vor bei dem ich glaube mir mit dem Shell Programm find viel Arbeit ersparen zu können. In einem Verzeichnis befinden sich viele Dateien. Diese möchte ich mit einem veränderten Dateinamen in ein anderes Verzeichniss verschieben.

Dies kann ich mittels
Code: (dl )
mv ./datei1.jpg ../images/videos_`echo './datei1.jpg' | sed 's/^\.\///'`

machen und das funktioniert auch einwandfrei. Nun können sich in dem Quellverzeichnis sehr viele Dateien befinden. Somit wollte ich dies mittels find machen, da es mir schon bei vielen solchen Massenaufgaben mittels einem Kommandoaufrufs viel arbeit abgenommen hat.
Was jedoch mittels find passiert ist folgendes was ich allerdings nicht so ganz verstehe. Kann mir das jemand erklären bzw. helfen.
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
format_c@manchester:/var/www/localhost/htdocs/web1/http/_images/bilder> ls
deadman.jpg higher_billboard.jpg my_sacrifice.jpg wawo.jpg
dsd.jpg highercover.jpg one_last_breath.jpg weathered_cover.jpg
faculty.jpg humanclaycover.jpg prisoncover.jpg what_if.jpg
higher.jpg my_own_prison.jpg scream3.jpg wtlf.jpg
format_c@manchester:/var/www/localhost/htdocs/web1/http/_images/bilder> \
> find -exec mv {} ../../images/videos_`echo '{}' | sed 's/^\.\///'` \;
mv: cannot move `.' to `../../images/videos_.': Device or resource busy
mv: cannot move `./deadman.jpg' to `../../images/videos_./deadman.jpg': No such file or directory
mv: cannot move `./dsd.jpg' to `../../images/videos_./dsd.jpg': No such file or directory
mv: cannot move `./faculty.jpg' to `../../images/videos_./faculty.jpg': No such file or directory
mv: cannot move `./higher.jpg' to `../../images/videos_./higher.jpg': No such file or directory
mv: cannot move `./higher_billboard.jpg' to `../../images/videos_./higher_billboard.jpg': No such file or directory
mv: cannot move `./highercover.jpg' to `../../images/videos_./highercover.jpg': No such file or directory
mv: cannot move `./humanclaycover.jpg' to `../../images/videos_./humanclaycover.jpg': No such file or directory
mv: cannot move `./my_own_prison.jpg' to `../../images/videos_./my_own_prison.jpg': No such file or directory
mv: cannot move `./my_sacrifice.jpg' to `../../images/videos_./my_sacrifice.jpg': No such file or directory
mv: cannot move `./one_last_breath.jpg' to `../../images/videos_./one_last_breath.jpg': No such file or directory
mv: cannot move `./prisoncover.jpg' to `../../images/videos_./prisoncover.jpg': No such file or directory
mv: cannot move `./scream3.jpg' to `../../images/videos_./scream3.jpg': No such file or directory
mv: cannot move `./wawo.jpg' to `../../images/videos_./wawo.jpg': No such file or directory
mv: cannot move `./weathered_cover.jpg' to `../../images/videos_./weathered_cover.jpg': No such file or directory
mv: cannot move `./what_if.jpg' to `../../images/videos_./what_if.jpg': No such file or directory
mv: cannot move `./wtlf.jpg' to `../../images/videos_./wtlf.jpg': No such file or directory
format_c@manchester:/var/www/localhost/htdocs/web1/http/_images/bilder>


Ich könnte das Problem durch aus auch mit Perl lösen nur möchte ich die Möglichkeiten der Konsole ausschöpfen, da das noch schneller ist wenn man sowieso schon damit arbeitet.

Gruß Alex\n\n

<!--EDIT|format_c|1108816297-->
betterworld
 2005-02-19 16:15
#95263 #95263
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
Du solltest Deine Backticks escapen, denn sie werden so, wie Du das geschrieben hast, schon expandiert, bevor find mit der Arbeit beginnt.

Ich nehme fuer sowas immer gerne xargs.
format_c
 2005-02-20 02:49
#95264 #95264
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Wie würde denn die variante mit xargs aussehen? Ich kriegs irgendwie nicht hin. Sobald ich die Pipe einbauen will kracht es.

Gruß Alex
betterworld
 2005-02-20 06:31
#95265 #95265
User since
2003-08-21
2614 Artikel
ModeratorIn

user image
1. Loesung:
Code: (dl )
rename ./ ../images/videos_ ./*

2. Loesung:
Code: (dl )
find . -mindepth 1 | xargs rename ./ ../images/viodeos_

3. Loesung:
Code: (dl )
find . -mindepth 1 | xargs -n1 sh -c 'mv "$0" ../images/videos_"`echo "$0" | sed "s#^\./##"`"'

Und zuletzt die vierte Loesung, und zwar dein urspruenglicher Vorschlag mit Reparatur:
Code: (dl )
find . -mindepth 1 -exec sh -c 'mv {} ../images/videos_`echo {} | sed "s/^\.\///"`' \;

Das "sh -c" ist notwendig, weil find das Kommando anscheinend nicht mit der Shell ausfuehrt, sondern einfach so.
(Ich habe ueberall .. statt ../.. verwendet, damit ich zum Testen nicht so viele Verzeichnisse anlegen muss ;-))\n\n

<!--EDIT|betterworld|1108873963-->
format_c
 2005-02-20 20:09
#95266 #95266
User since
2003-08-04
1706 Artikel
HausmeisterIn
[Homepage] [default_avatar]
Super funktionier klasse. Danke

Gruß alex
<< >> 5 Einträge, 1 Seite



View all threads created 2005-02-19 14:30.