2013-02-18 76 views
1

我試圖從遞歸查找命令中檢索文件名。此命令打印所有的文件名與全路徑使用find遞歸獲取bash腳本的文件名

> for f in $(find -name '*.png'); do echo "$f";done   
> ./x.png 
> ./bg.png 
> ./s/bg.png 

但是當我嘗試使用這些命令剛剛得到的文件的名稱,它打印

for f in $(find -name '*.png'); do echo "${f##*/}";done                          
bg.png 

for f in $(find -name '*.png'); do echo $(basename $f);done 
bg.png 

它省略其他2個文件。我是shell腳本的新手。我沒有弄清楚這個問題有什麼不對。

編輯:

這是我實際上想。

  1. 我想遍歷目錄遞歸,發現所有的PNG圖像
  2. 發送到pngnq的RGBA壓縮
  3. 它輸出與orgfilename-nq8.png
  4. 新的文件發送到pngcrush並重新命名,並生成一個新的文件(ORG文件將被覆蓋)
  5. 刪除新文件

我有一個SINGL工作的代碼Ë目錄

for f in *.png; do pngnq -f -n 256 "$f" && pngcrush "${f%.*}"-nq8.png "$f";rm "${f%.*}"-nq8.png; done 

我想這樣做遞歸

+0

如果你想知道爲什麼它WASN

find -name '*.png' -exec command {} + 

find -name '*.png' -exec bash -c 'do_something with ${1##*/}' -- {} \; 

搜索-printf不要做你想做的事情:你必須一直使用它作爲'for $ in'$(find -name'* .png')「; ...(帶引號),這是我的猜測,或者你已經改變了'IFS'? – 244an 2013-02-18 14:49:15

回答

0

簡單地做:

find -name '*.png' -printf '%f\n' 

如果你想運行的每個文件的內容:

find -name '*.png' -printf '%f\n' | 
while read file; do 
    # do something with "$file" 
done 

或用xargs

find -name '*.png' -printf '%f\n' | xargs -n1 command 

確保您不能直接使用find這樣的:上http://unixhelp.ed.ac.uk/CGI/man-cgi?find

man find | less +/^' *-printf' 
+0

這將打印所有文件名稱。但我需要一種方法來循環通過每個文件進行進一步處理。這就是爲什麼我用於尋找。怎麼做? – RameshVel 2013-02-18 14:48:12

+0

你想爲每個文件名做什麼?無論如何,看到我編輯的帖子 – 2013-02-18 14:48:50

+0

- 第一想把文件傳遞給一個外部程序來處理。 2 - 以某個新文件名輸出另一個文件(filename-xxxx.png)。 3。我想根據模式檢索新的文件名,並用它替換第一個文件名。 4.刪除生成的文件 – RameshVel 2013-02-18 14:50:52