PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Datein aus liste (txt) verschieben



TimoFrenzel
31.03.14, 13:09
Hi, da ich (noch) nicht so Linixversiert bin, eine kleine Frage.

Ich habe eine Text Datei mit einer Liste von Dateien.
Diese möchte ich kopieren.

In der Datei:

/xxx/xxx/xxx/imagesbak/bild1.png
/xxx/xxx/xxx/imagesbak/xxx/xxx/bild2.png
...

diese möchte ich dann hier her kopieren:

/xxx/xxx/xxx/images/bild1.png
/xxx/xxx/xxx/images/xxx/xxx/bild2.png
...


Die Zielordner müssen beim Kopieren erstellt werden, da diese noch nicht vorhanden sind.

Gibt da was feines?


was ich schon habe ist dies hier:

cat /home/vagrant/4.txt | while read file ; do cp "$file" /ziel/ ; done;

wie aber bekomme ich nun im zielstring das "imagesbak" zu "images"??



Dieser Versuch klappte nicht

cat /home/vagrant/4.txt | while read file ; do rename 's/imagesbak/images/g' $file > /home/vagrant/5.txt ; done

und

cat /home/vagrant/4.txt | while read file ; sed 's/imagesbak/images/g' $file > /home/vagrant/5.txt ; done

geht den inhalt der Datei durch statt den dateinamen

Timo

TimoFrenzel
31.03.14, 13:30
ah ok, scheint ich habe es...

cat /home/vagrant/4.txt | while read file ; do NEW=`echo $file | sed "s/imagesbak/images/g"` ; cp "$file" $NEW; done

Jetzt fehlt mir nur noch das anlegen der Verzeichnisse, wenn es nicht exestiert....

DrunkenFreak
31.03.14, 13:41
Mit dirname das Verzeichnis suchen und pauschal versuchen das Verzeichnis mit mkdir zu erstellen.

Vorher kann man natürlich auch mit test überprüfen, ob das Verzeichnis schon existiert.

TimoFrenzel
31.03.14, 13:56
ok, sollte noch jemand daran interessiert sein....


cat /home/vagrant/liste.txt | while read file ; do NEW=`echo $file | sed "s/imagesbak/images/g"` ; PFAD=`echo $NEW | sed -e "s/^\(\/.*\)\/\(.*\.*\)$/\1/"` ; mkdir -p $PFAD ; cp "$file" $NEW ; done

DrunkenFreak
31.03.14, 14:20
Wenn du es schon in einer Schleife machen willst, teste vorher, ob das Verzeichnis existiert. Das könnte sonst recht langsam werden:



cat list.txt|while read file
PFAD=`dirname $file`
if [ ! -d $PFAD ]
then
mkdir $PFAD
fi
...
done

buzz768
31.03.14, 18:02
Schau dir auch mal die Parameter Expansion (http://www.schlaefendorf.de/linux/bash.html#parameterexpansion) der Bash an


NEW=`echo $file | sed "s/imagesbak/images/g"`
PFAD=`echo $NEW | sed -e "s/^\(\/.*\)\/\(.*\.*\)$/\1/"`

geht einfacher und schneller so


NEW=${file//imagesbak/images}
PFAD=${NEW%/*}



Die Zielordner müssen beim Kopieren erstellt werden, da diese noch nicht vorhanden sind.

Gibt da was feines?
Ja, install mit der Option -D . Bei solchen Aufgaben mache ich, statt eine Schleife zu verwenden, aus der vorgegebenen Liste gerne mal eine Liste von Befehlen.


sed 'h;s/imagesbak/images/g;H;g;s/\n/ /;s/^/install -vDm644 /' liste.txt > commands.sh
bash commands.sh