2016-04-15 50 views
1

我有一個名爲assets的目錄,它還有一組目錄。對目錄進行迭代並在文件名中將'+'替換爲'_'

user_images 
|-content_images 
    |-original 
    |-cropped 
    |-resize 
|-gallery_images 
|-slider_images 
|-logo 

這些文件夾可以有像originalcroppedresize文件夾。而這些文件夾還會有圖像。這些圖像被命名爲這樣的– 14562345+Image.jpeg。我需要將+的所有圖像/文件替換爲_

for f in ls -a; 
do 
    if [[ $f == ​+​ ]] 
     then     
     cp "$f" "${f//+/_}" 
     fi 
done 

我能夠在當前目錄中執行此操作。但我需要將這個迭代到其他許多其他目錄。我怎樣才能做到這一點?

回答

2

您可以在進程替換使用使用find這個循環:

cd user_images 

while IFS= read -r -d '' f; do 
    echo "$f" 
    mv "$f" "${f//+/_}" 
done < <(find . -name '*+*' -type f -print0) 
+0

沒有工作。 :/ – nirvair

+0

它顯示目錄中的所有th文件,但不重命名該文件。 – nirvair

+0

我的意思是它沒有做任何事情。 – nirvair

0

隨着find -exec

find user_images -type f \ 
-exec bash -c '[[ $0 == *+* ]] && mv "$0" "${0//+/_}"' {} \; 

注意,這裏使用mv而不是cp作爲問題指出 「重命名」,但如果您想保留原始文件,只需將其替換爲cp即可。

bash -c需要能夠操作文件名,否則我們可以直接在-exec操作中使用{}

0

以下將遞歸地運行,將重命名的所有文件用_替換+:

find . -name '*+*' -type f -execdir bash -c 'for f; do mv "$f" "${f//+/_}"' _ {} + 

注意使用-execdir

-exec一樣,但指定的命令從包含匹配文件的子目錄運行,通常不是您開始查找的目錄 - 從man find引用。

如果目錄名稱與您不想重命名的模式*+*匹配,那麼這將保護我們。

相關問題