2013-07-25 57 views
1

我有一個帶有嵌套結構的「images」目錄,並且其中有.png文件。 我也有一個普通的目錄「svg」,裏面有一堆.svg文件。 我需要將每個.svg文件移動到相同的目錄中,其中.png文件具有相同的名稱。find + xargs:找到dir中的所有文件找到其他嵌套目錄中的對並移動到那裏

此命令爲單個給定.svg文件的工作原理:

find /images -name 'sample.png' | grep -v thumb | xargs -i{} dirname {}|xargs -0 -I {} mv /svg/sample.svg {} 

的grep -v拇指,因爲應用於每個PNG文件存在與其他子目錄名爲「拇指」同名縮略圖文件。

我試圖對所有的文件寫入該命令:

find /svg/ -name "*.svg" -exec basename {} '.svg' \; | xargs -O -I {} "find /images/ -name {}" 

但我收到和錯誤:`基名」通過信號終止13

此外,如果該第二命令的工作,下一步是將它與第一個命令結合起來,但這裏還有另外一個問題:我如何發送給定的文件名到最終的命令「mv」(參見代碼中的{???})?

find /svg/ -name "*.svg" -exec basename {} '.svg' \; | xargs -O -I {} "find /images/ -name {}" | grep -v thumb | xargs -i{} dirname {}|xargs -0 -I {} mv /svg/{???} {} 

回答

2

這個bash腳本應該可以工作。有時一種解決方案不能輕易塞進管道中:

#! /bin/bash 
for svg in svg/*.svg ; do 
    name=${svg##*/}         # Remove the path. 
    name=${name%.svg}        # Remove the extension. 
    png=$(find -name $name.png -not -path '*thumb*') 
    dir=${png%$name.png}        # Remove the filename. 
    mv "$svg" "$dir" 
done 
+0

工程就像一個魔術!非常感謝你! – karagota

相關問題