2016-03-21 20 views
0

Ich habe ein Bash-Skript #!/usr/bin/env bash, das als Teil eines Make-Prozesses bezeichnet wird. Dieses Skript erstellt ein Verzeichnis mit den relevanten Dateien für ein Realisieren und dann tar s sie auf. Ich möchte eine Kopie des Verzeichnisses machen und einige der Dateien umbenennen, um die Versionskennung durch das Wort "spätestes" zu ersetzen. Dies macht es einfach, die Erfassung der neuesten Datei von einem Webserver zu skripten. Wenn ich mein Skript ausführe, scheint der Aufruf an rename nichts zu tun, warum ist das so?Wie benenne ich erfolgreich umbenennen von einem Bash-Skript auf Ubuntu?

#!/usr/bin/env bash 

DATE_NOW="$(date +'%Y%m%d')" 
product_id_base="$1" 

firmware_dir="${product_id_base}-full-${DATE_NOW}" 

# ...rest of file ommitted to protest the innocent 
# It creates and fills the ${firmware_dir} with some files that end in 
# -$DATE_NOW.<extention> and I would like to rename the copies of them so that they end in 
# -latest.<extention> 
cp -a "./${firmware_dir}" "./${product_id_base}-full-latest" 

# see what there is in pwd 
cd "./${product_id_base}-full-latest" 
list_output=`ls` 
echo $list_output 
# Things go OK until this point. 

replacment="'s/${DATE_NOW}/latest/'" 
rename_path=$(which rename) 
echo $replacment 
perl $rename_path -v $replacment * 
echo $cmd 
pwd 

$cmd 

echo "'s/-${DATE_NOW}/-latest/g'" "${product_id_base}-*" 
echo $a 

# check what has happened 
list_output=`ls` 
echo $list_output 

Ich nenne die oben mit ./rename.sh product-id und die erwarteten Ausgabe von ls erhalten, dass das vorliegenden Arbeitsverzeichnis ist das ein volle Datei, die ich umbenannten will anzeigt.

$ ./rename.sh product-id ET-PIC-v1.1.dat ET-PIC-v1.1.hex 
product-id-20160321.bin product-id-20160321.dat 
product-id-20160321.elf product-id-20160321.gz 's/20160321/latest/' 

/home/thomasthorne/work/product-id/build/product-id-full-latest 
's/-20160321/-latest/g' product-id-* 

ET-PIC-v1.1.dat ET-PIC-v1.1.hex product-id-20160321.bin 
product-id-20160321.dat product-id-20160321.elf product-id-20160321.gz 

Was ich hüpfte war einige umbenannten Dateien zu sehen. Wenn ich die Umbenennungsfunktion direkt von einem Terminalemulator aus anrufe, sehe ich das Umbenennen.

~/work/product-id/build/product-id-full-latest$ rename -vn 
's/-20160321/-latest/g' * product-id-20160321.bin renamed as 
product-id-latest.bin product-id-20160321.dat renamed as 
product-id-latest.dat product-id-20160321.elf renamed as 
product-id-latest.elf ... 

Ich habe ein paar Variationen versucht, die Saiten zu entkommen, mit `oder $(), die Substitutionen von der alle Befehlszeile zu entfernen. Bis jetzt hat nichts funktioniert, also muss ich etwas Grundlegendes vermissen.

Ich habe gelesen, dass #!/usr/bin/env bash verhält sich sehr ähnlich wie #!/bin/bash, also glaube ich nicht, dass das bei spiel ist. Ich weiß, dass Ubuntu und Debian verschiedene Versionen des Umbenennungsskriptes zu einigen anderen Distributionen haben und ich benutze Ubuntu. Das führte mich zu versuchen perl /usr/bin/rename ... statt nur umbenennen, aber das scheint keinen wahrnehmbaren Unterschied gemacht haben.

Antwort

1

Diese Saite:

replacment="'s/${DATE_NOW}/latest/'" 

wird genau eingehalten werden, die gleiche, weil Sie es zwischen einfachen Anführungszeichen setzen.

Haben Sie versucht, mit:

replacment="s/${DATE_NOW}/latest/" 

Dieses auf meinem Ubuntu gearbeitet, ohne Perl:

$ ./test_script 
filename_20160321 renamed as filename_latest 
filename2_20160321 renamed as filename2_latest 
filename3_20160321 renamed as filename3_latest 

test_script Inhalt Wesen:

#!/bin/bash 

DATE_NOW="$(date +'%Y%m%d')" 

replacment="s/${DATE_NOW}/latest/" 

rename -v $replacment * 
+0

Ich war sicher, dass ich versucht hatte, dass während einer der vielen Permutationen, die ich in der letzten Stunde gemacht habe, aber es gescheitert ist. Ich habe es gerade erst ausprobiert und es funktioniert! Selbst wenn ich zurück zum trivialen "rename -v" s/$ {DATE_NOW}/neuste/"*" gehe, mit dem ich angefangen habe, scheinen die Dinge jetzt in Ordnung zu sein. Danke für die Lösung. Ich weiß nicht, was ich in den letzten 2 Stunden gemacht habe. – TafT

+0

Ich bin froh, dass ich helfen konnte! – zezollo