[linux shell] find file linux and copy them to

Tummelplatz für Computernutzer im allgemeinen und ihrer vielfältigen Probleme

Moderator: (M) Mod.-Team Allgemein

Benutzeravatar
petryxa
TalkING. Freak
TalkING. Freak
Beiträge: 108
Registriert: Sa, 28. Okt. 06, 22:53
Kontaktdaten:

[linux shell] find file linux and copy them to

Beitrag von petryxa » Do, 18. Nov. 10, 11:30

Moin alle,

ich wollte gerne die gefundene Dateien in ein andere Ordner verschieben. wie geht es?

ich habe:
petryxa@petryxa:~/bla$ find . -name *.tex -type f
./blabla/bla1.tex
./blabla/bla/bla2.tex
./bla3bla/bla3.tex

ich wollte jetzt alle 3 Dateien bla1.tex bla2.tex und bla3.tex im Ordner "gefunden" verschieben!

petryxa@petryxa:~/bla$ find . -name *.tex -type f | cp * ~/gefunden

so naiv ist Linux leider nicht=)

vielen Dank
---------------------------------------
TUHH wächst Bib und Mensa leider nicht=(

and here blog for Russian sailors:)
http://community.livejournal.com/yachting_rus/

Benutzeravatar
NightStalker
TalkING. Champion
TalkING. Champion
Beiträge: 891
Registriert: Mo, 21. Okt. 02, 20:40
Wohnort: Downloadbereich

Beitrag von NightStalker » Do, 18. Nov. 10, 12:17

funktioniert mit xargs, -print0 (zur Sicherheit) und list marker {} hier ein Beispiel:

http://www.cyberciti.biz/faq/linux-unix ... s-utility/
-- Chrząszcz brzmi w trzcinie w Szczebrzeszynie.
-- 好好学习,天天向上!

Benutzeravatar
380kV
TalkING. Freak
TalkING. Freak
Beiträge: 239
Registriert: Mi, 04. Jun. 08, 16:06

Beitrag von 380kV » Do, 18. Nov. 10, 13:13

Könnte man auch mit einer for-Schleife machen (bash):

Prüfen:

Code: Alles auswählen

for i in $(find . -name '*.odt' -type f); do echo "$i"; done
Verschieben:

Code: Alles auswählen

for i in $(find . -name '*.odt' -type f); do mv "$i" $TARGET; done
You should be studying.

Benutzeravatar
NightStalker
TalkING. Champion
TalkING. Champion
Beiträge: 891
Registriert: Mo, 21. Okt. 02, 20:40
Wohnort: Downloadbereich

Beitrag von NightStalker » Do, 18. Nov. 10, 13:28

@380kV
Interessant ist bei sowas immer was mit Leerzeichen im Namen passiert. Wird das da getrennt oder nicht ? Sonst kann man das zum Beispiel über Umdefinition von $IFS hinkriegen oder mit obskurer Bash-Syntax die ich immer vergesse.

Nebenbei, das Kopieren vieler Dateien aus unterschiedlichen Pfaden in ein Verzeichnis ist nicht ganz unkritisch. Namenskollisionen muß man entweder ganz ausschließlich oder irgendwie behandeln.
-- Chrząszcz brzmi w trzcinie w Szczebrzeszynie.
-- 好好学习,天天向上!

Benutzeravatar
380kV
TalkING. Freak
TalkING. Freak
Beiträge: 239
Registriert: Mi, 04. Jun. 08, 16:06

Beitrag von 380kV » Do, 18. Nov. 10, 13:38

NightStalker hat geschrieben:@380kV
Interessant ist bei sowas immer was mit Leerzeichen im Namen passiert. Wird das da getrennt oder nicht ? Sonst kann man das zum Beispiel über Umdefinition von $IFS hinkriegen oder mit obskurer Bash-Syntax die ich immer vergesse.
Das hängt von $IFS und Einstellungen deiner Shell ab, ja :)


Nebenbei, das Kopieren vieler Dateien aus unterschiedlichen Pfaden in ein Verzeichnis ist nicht ganz unkritisch. Namenskollisionen muß man entweder ganz ausschließlich oder irgendwie behandeln.
Das sollte man natürlich auch beachten... vielleicht könnte man da noch was Obskures mit rsync und in/excludes bauen ^^
You should be studying.

Benutzeravatar
petryxa
TalkING. Freak
TalkING. Freak
Beiträge: 108
Registriert: Sa, 28. Okt. 06, 22:53
Kontaktdaten:

Beitrag von petryxa » Do, 18. Nov. 10, 14:07

vielen Dank erstmal!

$ find . -name "*.bak" -print0 | xargs -0 -I {} mv {} ~/old.file
ist genau was ich gesucht habe.
statt "mv" kann mach auch "cp" usw.

zusätzliche Frage=)

wie kann man beim copieren/verschieben für die gleiche Dateien, dei Dateiname automatisch ändern.

zB
ich habe
./bla/blup1.tuhh
./bla2/blup1.tuhh

mache
$ find . -name "*.tuhh" -print0 | xargs -0 -I {} cp -vi {} ./tuhh

bekomme
:ls ./tuhh
:blup1.tuhh

gewünscht ist
:ls ./tuhh
:blup1.tuhh
blup1-001.tuhh

wie geht das?
---------------------------------------
TUHH wächst Bib und Mensa leider nicht=(

and here blog for Russian sailors:)
http://community.livejournal.com/yachting_rus/

Benutzeravatar
NightStalker
TalkING. Champion
TalkING. Champion
Beiträge: 891
Registriert: Mo, 21. Okt. 02, 20:40
Wohnort: Downloadbereich

Beitrag von NightStalker » Do, 18. Nov. 10, 16:18

Wußte ich doch, das wird ein Problem für dich ;)

Sorry, für die exakte Syntax müsste ich jetzt auch nachsehen, aber ich würds etwa so machen: Anstelle des cp/mv in obigem Befehl 'ne Schleife nehmen, welche als erstes prüft ob der Name schon existiert, dann bei Bedarf einen neuen anlegt wieder prüft usw. solange bis man 'nen Zielnamen hat den man benutzen kann und dann cp/mv. Zu Hause hab ich so ein ähnliches Beispiel ... wenn's bis dahin keiner genauer geschrieben hat, kann ich nochmal nachsehen.
-- Chrząszcz brzmi w trzcinie w Szczebrzeszynie.
-- 好好学习,天天向上!

Benutzeravatar
NightStalker
TalkING. Champion
TalkING. Champion
Beiträge: 891
Registriert: Mo, 21. Okt. 02, 20:40
Wohnort: Downloadbereich

Beitrag von NightStalker » Do, 18. Nov. 10, 21:17

Code: Alles auswählen

FILE="test"; BACKUP=$FILE; c=0; while [[ -e "$BACKUP" ]] ; do c=$(($c+1)); NR=$(printf %03d $c); BACKUP="${FILE}-${NR}"; done; echo $BACKUP
Sucht nach Datei "test" und hängt so lange Zahlen an bis ein Dateiname noch nicht vergeben ist (welcher am Ende in $BACKUP steht).

Es müsste auch in Bash gehen ;) Hab mich bemüht es nicht "zsh-kompakt" zu machen.
-- Chrząszcz brzmi w trzcinie w Szczebrzeszynie.
-- 好好学习,天天向上!

whoodoo
TalkING. Superposter
TalkING. Superposter
Beiträge: 655
Registriert: So, 15. Aug. 04, 11:28

Beitrag von whoodoo » Do, 18. Nov. 10, 21:21

bei so viel nerdigkeit auch nochmal meine bescheidene frage. habe ein paar compilations in folgender form (verzeichnisse)

blabla1
blabal2
...
blabla10
blabal11
..
blabla100


nun würde ich gerne die führenden nullen auffüllen, so dass nachher folgendes bei raus kommt:
blabla001
...
blabla100


any ideas?

Benutzeravatar
NightStalker
TalkING. Champion
TalkING. Champion
Beiträge: 891
Registriert: Mo, 21. Okt. 02, 20:40
Wohnort: Downloadbereich

Beitrag von NightStalker » Do, 18. Nov. 10, 23:14

Code: Alles auswählen

name="t35t 34 2"; prefix=$(echo $name | sed 's:[0-9]*$::'); suffix=$(echo $name | grep -o '[0-9]*$'); echo "${prefix}$(printf %03d $suffix)"
Holt sich die letzte durchgängige Zahl vom Namen und erweitert (nur diese !) auf 3 Stellen mit führenden Nullen ;)
-- Chrząszcz brzmi w trzcinie w Szczebrzeszynie.
-- 好好学习,天天向上!

Antworten