2012-10-01 55 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