2010-07-21 142 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'