2016-03-21 26 views
0

Bir make işleminin parçası olarak adlandırılan bir bash betiği #!/usr/bin/env bash var. Bu betik, bir gerçekleştirme ile ilgili dosyaları içeren bir dizin oluşturur ve daha sonra tar s onları oluşturur. Dizinin bir kopyasını almak ve "en son" sözcüğü ile sürüm tanımlayıcısını değiştirmek için bazı dosyaları yeniden adlandırmak istiyorum. Bu, en son dosyanın bir web sunucusundan elde edilmesini betimlemeyi kolaylaştıracaktır. Komut dosyasını çalıştırdığımda, rename numaralı çağrı hiçbir şey yapmıyor gibi görünüyor, neden bu? Ubuntu'daki bir bash komut dosyasından nasıl yeniden adlandırılır?

#!/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 

Ben ./rename.sh product-id yukarıda diyoruz ve mevcut çalışma dizini ben yeniden adlandırılmış istediğiniz dosyaların tam biridir gösterir ls beklenen çıkışı olsun.

$ ./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 

Yeniden adlandırdığım bazı dosyalar yeniden adlandırıldı. Bir yeniden adlandırma işlevini doğrudan bir terminal öykünücüsünden aradığımda yeniden adlandırmayı görüyorum.

~/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 ... 

Ben dizeleri kaçan `ya $() kullanarak komut satırından tüm değiştirmelerin uzaklaştırmaya birkaç varyasyonları çalıştılar. Şimdiye kadar hiçbir şey işe yaramadı, bu yüzden temel bir şey eksik olmalıyım.

#!/usr/bin/env bash'un #!/bin/bash gibi davrantığını okudum, bu yüzden oyunda olduğunu düşünmüyorum. Ubuntu ve Debian'ın yeniden adlandırma betiğinin farklı sürümlerini başka bazı dağıtımlara sahip olduğunu biliyorum ve Ubuntu'da koşuyorum. Bu, sadece yeniden adlandırmak yerine perl /usr/bin/rename ...'u aramayı denememi sağladı ancak bu fark edilebilir bir fark yaratmadı.

cevap

1

Bu dize:

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

Eğer tek tırnak arasına koydu, çünkü tam olarak aynı tutulacaktır.

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

test_script içerik varlık:

#!/bin/bash 

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

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

rename -v $replacment * 
+0

emindim ben denemiş

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

Bu seferki perl olmadan, benim Ubuntu üzerinde çalıştı:

ile siz denediniz Geçen saatte yaptığım birçok permütasyon sırasında ama başarısız oldu. Şimdi denedim ve işe yarıyor! Şeyleri yeniden başlattığım zaman bile, her şeyle başladığım 'yeniden adlandıran -v' ler/$ {DATE_NOW}/en son/"*. Çözüm için teşekkürler. Son 2 saat boyunca ne yaptığımı bilmiyorum. – TafT

+0

Sevindim Yardımcı olabilirim! – zezollo

İlgili konular