2010-07-21 95 views
2

我有一個文件夾,裏面有很多多語言網站的圖片,圖片以下一種格式存儲在filename.lang_code.jpg上,在部署腳本上我想選擇正確的文件對於我正在部署的站點並將其複製到filename.jpg,以便我可以在站點之間共享相同的CSS。在bash中重命名文件,保持原始文件不變

所以,我需要的是類似命令重命名,但執行副本,而不是一個行動,因爲我需要保留所有文件。

我正在做下一代碼,但我覺得它過於複雜和糟糕。

find -name "*.es.*" -print0 | xargs --null -I {} sh -c "echo {} | sed 's/.es//' | xargs -I }{ sh -c 'cp {} }{'" 
+1

有什麼理由不使用(符號)鏈接? – 2010-07-21 07:35:49

+0

你考慮過軟鏈接而不是副本嗎?這將節省大量的磁盤空間和時間。 – 2010-07-21 07:36:12

+0

是的,我可以使用softlinks來節省空間,實際上我會:) – hchinchilla 2010-07-21 09:43:17

回答

1
find -name '*.es.*' -exec bash -c 'cp "$1" "${1/.es./.}"' modlang {} \; 
+0

爲什麼不考慮使用xargs或+; (GNU find)? – ghostdog74 2010-07-21 07:38:13

0

for循環怎麼樣?

for x in *.es.* ; do 
    xx=$(echo ${x} | sed 's/\.es//') 
    cp ${x} ${xx} 
done 
1

慶典4

shopt -s globstar 
for file in **/*.es* 
do 
    newfilename=${file/.es/} 
    cp "$file" ""$newfilename" 
done 
使用

找到

find . -type f -iname "*.es.*" -print | sed 's/\(.*\)\.es\.\(.*\)/mv \1.es.\2 \1\2/' |bash 
0

嗯..你可以只複製一大堆你想JPG文件的,把他們在目錄中你需要他們,只需從那裏重命名他們?

喜歡的東西:

cp *.jpg /src /dst 
cd /dst && rename 's/\.es//' *.jpg 

rename命令是一個perl腳本的包裝。

2

這種複製/重命名通常更容易在zsh中執行,您不需要編寫for循環或find命令。

zmv -Ls '(**)/(*).es.(*)' '$1/$2.$3' 

-Ls是創建符號鏈接;取代-C作爲副本,或者沒有任何舉動。其他有用的選項是-i(要求確認每個副本/移動)和-n(只顯示會發生什麼,但不實際執行副本/移動)。

$1$2$3在替換文本指的是第一,第二和第三帶括號的組中的圖案。在該模式中,**/表示任何目錄鏈。

您可能需要首先使用autoload zmv加載zmv命令。這可以有用地進入你的.zshrc,以及alias zcp='zmv -L'alias zln='zmv -L'