2016-05-23 48 views
1

我有一個包含很多文件的目錄 - txt等。 我想更改擴展那些等文件到txt更改dir中每個文件的擴展名,* .txt除外

現在 - 我用這個:

find . ! -name '*.txt' -type f -exec ls -f {} + > to_txt.txt 
for i in ``cat to_txt.txt``; do 
    mv $i $i.txt && echo $i "File extension have been changed" || echo "Something went wrong" 
done; 
rm to_txt.txt 

腳本工作正常,但我認爲這是笨拙 有沒有更聰明,優雅的方式來做到這一點?

+0

你認爲這種方式笨拙,愚蠢或不雅? –

+0

我不知道,即時通訊相當新的東西,並尋找順利的解決方案。正如你所看到的,Fedorqui只用了一行;) – Fangir

回答

2

只需使用-exec執行mv命令:

find . ! -name '*.txt' -type f -exec mv {} {}.txt \; 
#         ^^^^^^^^^^^^ 
#         here the magic 

這是如何工作的?

find . ! -name '*.txt' -type f是你已經擁有的:它尋找那些名字不是以.txt結尾的文件。

然後,關鍵是使用-exec:那裏,我們利用{},它攜帶已發現的每個文件的值。由於它作爲一個變量,你可以像這樣使用它並執行命令。在這種情況下,你想要做mv $file $file.txt,所以這就是我們所做的:mv {} {}.txt。爲了使它工作,我們終於必須添加\;部分。

+0

很好用;)不會濫用你的善意,但是你能否給我一點解釋,你在這裏做了什麼?嘗試通過'man find'理解,但幾乎沒有結果 – Fangir

+0

@Fangir肯定!看到我更新的答案。 – fedorqui

+0

thak you very much;)我的理解是否正確 - 直到在行尾添加'\:',我可以使用'{}'將文件名存儲爲變量,並執行另一個操作? – Fangir