2013-10-29 67 views
4

經過大量搜索和反覆試驗,我無法對文件目錄執行批次mvrename。我想要做的是移動或重命名目錄中的所有文件,以便mv'd或renamed文件將$date (+ '%Y%d%m')添加到原始後綴中。批量mv或在bash腳本中重命名 - 追加日期作爲後綴

所有原始文件有唯一的前綴,但要麼是.xml.txt所以我想從org_prefix.org_suffix去 - >org_prefix.org_suffix.DATE

我已經試過這樣:

$ mv /directory/* /directory/*$(date (+ '%Y%m%d') 

但總是/directory/*.actualdate' is not a directory錯誤。

我已經試過這樣:

$ for f in *; do mv $ $f.$(date +'_%m%d%y'); done 

,但我得到mv: cannot stat '$'; No such file or directory

最後,我甚至試過這樣:

$ rename 's/*/.test/' * 

只是爲了看看,如果我可以改變一切文件到org_prefix.test但沒有任何反應(沒有錯誤,nada,zip)

任何幫助不勝感激。

回答

4

通過文件的正確方法循環在當前目錄下(例如和,打印他們的名字)是:

for file in *; do 
    echo "$file" 
done 

您將如何追加的日期?當然是這樣的:

for file in *; do 
    echo "$file.$(date +%Y%m%d)" 
done 

你打算怎麼做?像這樣,當然:

for file in *; do 
    mv -nv -- "$file" "$file.$(date +%Y%m%d)" 
done 

我說:

  • -v使mv是詳細(我想知道發生了什麼,它總是令人印象深刻小妹妹看流動所有這些行屏幕上)。
  • -n以便不覆蓋原本存在的文件。安全第一。
  • --只是爲了防止文件名以連字符開頭:沒有--,mv會混淆選項。安全第一。

如果你只是想通過與擴展.banana的文件看,更換for有:

for file in *.banana; do 

爲包含單詞banana文件:

for file in *banana*; do 

等。

跟上香蕉!

+0

謝謝爲此 - 它也適用。如果我想把它放在bash腳本中,並從cron作業調用它,那麼正確的語法是: for file in/some_directory/*;做 mv -nv - 「$ file」「/ new_directory $ file $(date +%Y%m%d)」 done – user2755742

+0

@ user2755742如果它是從cronjob調用的,則不需要'-v'開關,除非你想記錄這個輸出。除此之外,這一切都很好! (在將腳本放入crontable之前嘗試腳本,檢查一切正常)。 –

1
$ mv /directory/* /directory/*$(date (+ '%Y%m%d') 

這是不行的,因爲*擴大到所有文件的列表,所以膨脹後的命令是這樣的:

mv /directory/file1 /directory/file2 /directory/file3 /directory/file1_date /directory/file1_date ... 

所以,你必須指定多個目的地,但mv的語法只允許一個目標。

for f in *; do mv $ $f.$(date +'_%m%d%y'); done 

在這裏,你忘了f$後,這就是爲什麼你會得到錯誤信息。

for f in *; do mv $f $f.$(date +'%m%d%y'); done 

我認爲這應該現在工作,但不要忘記引用所有變量!

最後:

for f in *; do mv "$f" "$f.$(date +'%m%d%y')"; done 

編輯:當有一個變量後直接字符,它的使用{}明確指出,他們不是變量名的一部分,好的做法:

for f in *; do mv "$f" "${f}.$(date +'%m%d%y')"; done 
+0

這也適用。感謝所有海報。 – user2755742