2012-10-16 71 views
2

我正在尋找一種遞歸地查找擴展名爲X(.js)的文件並在擴展名爲Y( .ts)的同一目錄中創建該文件的副本。Linux/Cygwin遞歸複製文件更改擴展

例如/foo/bar/foobar.js - > /foo/bar/foobar.js和/foo/bar/foobar.ts

/foo/bar.js - > /foo/bar.js和/ foo /bar.ts等等等等

我的盡職調查: 我想用找到& xargs的& CP和括號擴展(cp foobar.{js,ts}),但是xargs的都使用大括號來表示從xargs的傳遞文件的列表。這讓我感到難過,因爲我最近才發現這種令人敬畏的醬油是支撐膨脹/替代品。

我覺得必須有單線解決方案,但我正在努力想出一個解決方案。

我發現了執行任務的想法:將需要的內容複製到一個新目錄,然後將此目錄與新目錄合併;遞歸地在每個目錄中運行重命名腳本;使用rsync複製;使用find,xargs和cpio。

現在看來,運行一個像this這樣的重命名腳本腳本就是我最終要做的。

+0

也許最好問一下http://unix.stackexchange.com/ –

+0

'xargs'不會專門解釋'{}'。但是,如何在xargs中從'foobar.js'獲得'foobar'? – choroba

+0

我已經使用{}作爲xargs中的參數列表。我想我認爲這是做到這一點的方法。糟糕!無論如何,如果有辦法在傳遞給xargs的參數列表上執行一些sed/awk/bash魔法來獲得所需的名稱更改,我會很高興。我假設@choroba不知道怎麼樣? –

回答

7
find . -name "*.js" -exec bash -c 'name="{}"; cp "$name" "${name%.js}.ts"' \; 

使用find,你可以在你已經發現,通過使用-exec選項文件直接執行的命令;你不需要通過xargs管道。它接受命令後接命令的參數,後跟一個參數;,您必須轉義才能避免shell解釋它。 find將在找到的文件的命令名或參數中替換任何出現的{}

爲了調用一個適當的代替命令,可以採取多種方法,但一個簡單的方法是使用Bash的parameter expansion。您需要定義一個包含名稱的shell參數(在這種情況下,我創建了name={}),然後您可以使用參數擴展。 ${variable%suffix}$variable的值去掉suffix;然後,我添加.ts到最後,並有我正在尋找的名稱。

+0

非常感謝。在看到它在某些帖子中使用後,我剛剛閱讀了-exec。 –

+0

有人可以解釋使用尾隨\;我瞭解指揮部的其他部分,但對尾隨斜線的效果感到好奇。 –

+0

@NKlosterman沒問題!我已經用引用更新了我的答案,以便讓它更安全一點,如果您的文件名中有空格並提供了一些鏈接。尾部的'\;'是在'-exec'的參數已經停止時告訴'find'。它正在尋找一個由';'組成的參數,但是默認情況下,shell會將其解釋爲'find'命令末尾的分隔符,因此您需要引用它。你也可以寫'';',但是這比'\;'更多的字符。 –