2012-10-01 58 views
1

我有一个包含图像的文件夹,我需要将它们复制到别处去除进度中的特殊字符。 可以说我有这个Find&Xargs通过bash脚本进行复制和重命名

Folder1/ImageÑ%1.jpg 
Folder1/ImageÑ%1-70x70.jpg 
Folder1/ImageÑ%2.jpg 
Folder1/ImageÑ%2-70x70.jpg 
Folder1/ImageÑ%3.jpg 
Folder1/ImageÑ%3-100x100.jpg 
Folder1/ImageÑ%4.jpg 
Folder1/ImageÑ%4-100x100.jpg 

我要复制只是没有在名称文件夹2“-70x70”或“-100x100”和是这样(没有任何特殊字符)的文件:

Folder2/Image1.jpg 
Folder2/Image2.jpg 
Folder2/Image3.jpg 
Folder2/Image4.jpg 

我已经成功地复制这些文件,但我不知道如何重命名文件(删除特殊字符)在相同的步骤。我认为它使用SED,但我不知道如何。

find Folder1 -type f -regextype posix-extended \(! -regex '.+\-[0-9]{2,4}x[0-9]{2,4}\.jpg' \) -print0 | xargs -0 cp -p --target-directory=Folder2 

谢谢!

回答

2

这也许对你有用:

#!/bin/bash 
DIR=/your/Folder1 
DEST=/your/Folder2 

for f in `ls -1 $DIR | grep .jpg | egrep -v ".+\-[0-9]{2,4}x[0-9]{2,4}\.jpg"` 
do 
     f=$(basename $f) 
     F=$(echo "$f" | sed "s/[^A-Z|a-z|0-9|\.]//g;") 
     cp -p "$DIR/$f" "$DEST/$F" 
done 

如果你needit你可以用它代替CP MV。

EDITED

这将只能得到你要复制的文件:

ls -1 $DIR/*.jpg | egrep -v ".+\-[0-9]{2,4}x[0-9]{2,4}\.jpg 

基名命令,以取代堰字符和准备搬家 只得到文件名sed它取代所有字符,如果不是字母和数字(和一个文件扩展名的点)

4

要删除怪异的人物,我建议你detox

然后:

find Folder1 \(! -name 'Image*-70x70*' -a ! -name 'Image*-100x100*' \) | 
    xargs -i% cp -p % Folder2 

编辑

找到解释:

  • !字符是ñ egation
  • -a选项是一个AND条件
  • 括号在那里封闭条件

EDIT2

要做到这一点就飞象你问(用于替代怪异字符) :

find Folder1 \(! -name 'Image*-70x70*' -a ! -name 'Image*-100x100*' \) \ 
    -exec bash -c ' 
     file=$(echo "$1" | perl -pe "s/\303\221%/_weird_/g") 
     cp -p "$1" "Folder2/$file" 
    ' -- {} \; 
+0

编辑错误找到选项 –

+0

POST编辑解释查找语法 –

+0

是否可以在同一步骤运行排毒?我的意思是我无法重命名文件夹1中的文件 –

1

东西l也许呢?

for file in Folder1/*.jpg; do 
    case $file in 
    *-70x70.jpg | *-100x100.jpg) ;; 
    *) cp "$file" "Folder2/Image${file#Folder1/Image?}" ;; 
    esac 
done 

的构建${variable#pattern}去除的$variable的值的开头任何匹配pattern。模式Folder1/Image?与文字文本Folder1/Image(我们先前将静态Image部分返回)和一个任意字符相匹配。

如果违规字符不是单个字节,请尝试将问号翻一番;这将匹配两个任意字符(或字节,如果您的语言环境等配置这种方式)。如果你有一个合并的Unicode序列,它所需要的不仅仅是 - 用于表示文件名的实际字节的十六进制转储将有助于诊断。无论如何,你可以简单地从另一端修剪,尽管这会涉及更多一点;从端部,而不是一开始,并加倍#%

*) base=${file#Folder1/} 
    prefix=${base%%[0-9]*} 
    cp "$file" "Folder2/Image${base#$prefix}" ;; 

的变体${variable%pattern}修剪使shell修剪的最长可能的匹配,而不是最短的。 (我相信最长的匹配是Bash扩展?)

+0

不可以,奇怪的字符仍然存在于Folder2中。失败。 –

+0

适合我。但我编辑了我的答案;也许它现在适合你? – tripleee