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.
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
Ich bin froh, dass ich helfen konnte! – zezollo