2012-06-24 481 views
1

試圖將目錄中的所有文件重命名爲$arg[1] + number of filelinux命令行重命名提供參數的所有文件

例如這些文件:

gfdgfdh.jpg 
fgdsyugfs.jpg 
gfyudsfuds.jpg 

將成爲繼當我在命令行做sh myscript.sh dog

dog0.jpg 
dog1.jpg 
dog2.jpg 

這是我迄今,正則表達式的作品,因爲如果代碼它在它的工作命令行上對一個文件嘗試rename命令。

#! /bin/sh 
COUNTER=0 
PREFIX=$1 
for i in *.jpg 
do 
     rename 's/.*[^.jpg]/${PREFIX}${COUNTER}/' $i 
     COUNTER=COUNTER+1 
done 

我得到的錯誤是

Global symbol "$PREFIX" requires explicit package name at (eval 1) line 1. 
+4

該正則表達式不會做你認爲它。 –

回答

3

錯誤是由你把$PREFIX'',不擴大其造成的事實,但它傳遞給Perl程序rename,這反過來似乎將該模式評估爲Perl代碼。

腳本中的另一個錯誤是COUNTER=COUNTER+1。 shell不會那樣工作。試試這個(未經測試):

#!/bin/sh 
prefix=$1 

count=0 
for f in *.jpg; do 
    mv "$f" "$prefix$count".jpg 
    count=`expr $count + 1` 
done 
+0

感謝這項工作,並向我展示了我之前沒做過的一些事情 – brux

+0

'expr'不是必須的:'((count ++))'是你所需要的。 –

+1

@DennisWilliamson:OP使用'/ bin/sh'作爲shell,在許多平臺上(包括Ubuntu)不是Bash,而是一個精簡的POSIX shell。 '((count ++))'在POSIX中不起作用。 –

1

命名接受一個Perl程序/表達和你的情況$ PREFIX被解釋爲一個變量。

重命名是批量重命名文件的工具,您正在使用它來重命名僅文件。更好的方法是:

PREFIX=dog; 
rename "s#[^/]*.jpg#'$PREFIX' . \$main::C++ . '.jpg'#e" tmp/*.jpg 
+1

我不認爲括號是必要的。 –

0

與「重命名」命令

rename 's/.*/dog$N.jpg/' *.jpg