2017-07-18 4 views
0

Ich möchte Duplikate der Dateien mit anderem Namen.
Ich probiere gerade diese Befehle aus, bevor ich sie in mein Bash-Skript setze.Erstellen Sie doppelte Datei und benennen Sie sie um

$ set dir = /somewhere/states 
$ find $dir -name "total.txt" -type f | xargs ls -1 
/somewhere/states/florida/fixed.fl_Asite_ttl/somewhere/total.txt 
/somewhere/states/hawaii/fixed.hi_Bsite_ttl/somewhere/total.txt 
/somewhere/states/kentucky/fixed.ky_Asite_ttl/somewhere/total.txt 
/somewhere/states/michigan/fixed.mi_Csite_ttl/somewhere/total.txt 
/somewhere/states/texas/fixed.tx_Vsite_ttl/somewhere/total.txt 

Ich weiß, ich Datei mit so etwas wie diese umbenennen können, aber es ist nicht genau das, was ich will:

$ find $dir -name "total.txt" -exec sh -c 'cp {} `dirname {}`/`basename {} `why.xls' \; 
/somewhere/states/florida/fixed.fl_Asite_ttl/somewhere/total.txtwhy.xls 
/somewhere/states/hawaii/fixed.hi_Bsite_ttl/somewhere/total.txtwhy.xls 
/somewhere/states/kentucky/fixed.ky_Asite_ttl/somewhere/total.txtwhy.xls 
/somewhere/states/michigan/fixed.mi_Csite_ttl/somewhere/total.txtwhy.xls 
/somewhere/states/texas/fixed.tx_Vsite_ttl/somewhere/total.txtwhy.xls 

Darf ich wissen, wie die Dateien zu kopieren und haben die neuen Dateien in der gleiches dir?
unten sind die Beispiele.
Ich möchte die neuen Dateien als alles hinter "behoben." und vor dem „/ irgendwo“ und das Ändern der Dateierweiterung als auch

/somewhere/states/florida/fixed.fl_Asite_ttl/somewhere/fl_Asite_ttl.xls 
/somewhere/states/hawaii/fixed.hi_Bsite_ttl/somewhere/hi_Bsite_ttl.xls 
/somewhere/states/kentucky/fixed.ky_Asite_ttl/somewhere/ky_Asite_ttl.xls 
/somewhere/states/michigan/fixed.mi_Csite_ttl/somewhere/mi_Csite_ttl.xls 
/somewhere/states/texas/fixed.tx_Vsite_ttl/somewhere/tx_Vsite_ttl.xls 

Update: /somewhere/states/florida_fixed_ttl/fixed.fl_Asite_ttl/somewhere/total.txt

+0

'cat somefile.txt> newfile.txt'? – T4rk1n

+0

Hallo @ T4rk1n, war ich nicht beabsichtigen, die Dateien zu überschreiben? Ich versuche, die Dateien zu kopieren und umzubenennen. Um 2 ähnliche Dateien im selben Verzeichnis zu haben, aber mit diff-Namen. – Santa

+0

diese Zeile wird genau das tun, lesen Sie den Inhalt einer Datei und leiten Sie es in eine neue Datei. – T4rk1n

Antwort

1

Wahrscheinlich nicht das eleganteste, aber diese funktionieren soll:

find . -name total.txt | while read F ; do [[ $F =~ fixed.[^/]* ]] ; N=$(echo $BASH_REMATCH | sed s/fixed\.//) ; echo "cp $F $(dirname $F)/$N.xls" ; done 

Wenn Sie mit dem Ausgang das letzte Echo gerade glücklich sind zu entfernen, das heißt das:

echo "cp $F $(dirname $F)/$N.xls" 

dazu:

cp "$F" "$(dirname $F)/$N.xls" 

Hinweis, wenn die .txt und .xls Inhalte immer gleich bleiben wird können Sie ln statt cp verwenden - eine Datei, zwei Namen.

+0

Dank @Wayne, würde es Ihnen etwas ausmachen, ein wenig mehr über die Methode zu erklären? Ich habe ein wenig gesucht, $ BASH_REMATCH nimmt tatsächlich alle '= ~' Ergebnisse auf. Was ist mit dem N Teil? – Santa

+0

Ja, $ BASH_REMATCH wird ein Array aller Übereinstimmungen sein. Aber da es nur eine Übereinstimmung gibt, können Sie $ BASH_REMATCH anstelle von $ {BASH_REMATCH [1]} verwenden. Um das Skript zu verbessern, sollten Sie alle Variablen in Anführungszeichen setzen und die Fehler-/Erfolgsrückgabe der Übereinstimmung prüfen, bevor Sie $ BASH_REMATCH verwenden. Der Teil N = $ (...) entfernt nur die Zeichenfolge "fixed". aus der Übereinstimmung, wobei nur der gewünschte Teil als Dateiname übrig bleibt. –

+0

wow danke @Wayne Vosberg, eine letzte Sache, aufgrund einiger unvorhergesehener Umstände, der Pfad hat ein paar kleine Änderungen, wie im obigen Update gezeigt, habe ich versucht [[$ F = ~ /"fixed.[^/]*]]] und [[$ F = ~ /fixed.[^/]*]], beide geben die selbe Ausgabe an, die zweimal vom 'festen' übereinstimmt?! Kann ich wissen, wie man nur 5 Dateien anstelle von 10 Dateien bekommt? – Santa

Verwandte Themen