2017-07-18 65 views
0

我想使用不同名稱的文件的副本。
我目前正在嘗試這些命令,然後將它們放入我的bash腳本。創建重複文件並將其重命名

$ set dir = /somewhere/states 
$ find $dir -name "total.txt" -type f | xargs ls -1 
/somewhere/states/florida/fixed.fl_Asite_ttl/somewhere/total.txt 
/somewhere/states/hawaii/fixed.hi_Bsite_ttl/somewhere/total.txt 
/somewhere/states/kentucky/fixed.ky_Asite_ttl/somewhere/total.txt 
/somewhere/states/michigan/fixed.mi_Csite_ttl/somewhere/total.txt 
/somewhere/states/texas/fixed.tx_Vsite_ttl/somewhere/total.txt 

我知道我可以用這樣的重命名文件,但它不正是我想要的:

$ find $dir -name "total.txt" -exec sh -c 'cp {} `dirname {}`/`basename {} `why.xls' \; 
/somewhere/states/florida/fixed.fl_Asite_ttl/somewhere/total.txtwhy.xls 
/somewhere/states/hawaii/fixed.hi_Bsite_ttl/somewhere/total.txtwhy.xls 
/somewhere/states/kentucky/fixed.ky_Asite_ttl/somewhere/total.txtwhy.xls 
/somewhere/states/michigan/fixed.mi_Csite_ttl/somewhere/total.txtwhy.xls 
/somewhere/states/texas/fixed.tx_Vsite_ttl/somewhere/total.txtwhy.xls 

我可能知道如何複製文件,並有在新的文件相同的目錄?下面的例子是

我想將新文件命名爲「固定」後面的所有內容。與之前的「/地方」,改變文件擴展名,以及

/somewhere/states/florida/fixed.fl_Asite_ttl/somewhere/fl_Asite_ttl.xls 
/somewhere/states/hawaii/fixed.hi_Bsite_ttl/somewhere/hi_Bsite_ttl.xls 
/somewhere/states/kentucky/fixed.ky_Asite_ttl/somewhere/ky_Asite_ttl.xls 
/somewhere/states/michigan/fixed.mi_Csite_ttl/somewhere/mi_Csite_ttl.xls 
/somewhere/states/texas/fixed.tx_Vsite_ttl/somewhere/tx_Vsite_ttl.xls 

更新: /somewhere/states/florida_fixed_ttl/fixed.fl_Asite_ttl/somewhere/total.txt

+0

'cat somefile.txt> newfile.txt'? – T4rk1n

+0

嗨@ T4rk1n,我不打算覆蓋文件?我試圖複製和重命名文件。在同一個目錄中有兩個相似的文件,但是有不同的名稱。 – Santa

+0

該行將完成該操作,讀取文件的內容並將其傳送到新文件中。 – T4rk1n

回答

1

可能不是最優雅,但這種應工作:

find . -name total.txt | while read F ; do [[ $F =~ fixed.[^/]* ]] ; N=$(echo $BASH_REMATCH | sed s/fixed\.//) ; echo "cp $F $(dirname $F)/$N.xls" ; done 

如果你很高興與輸出只是刪除最後的回聲,即這樣的:

echo "cp $F $(dirname $F)/$N.xls" 

這樣:

cp "$F" "$(dirname $F)/$N.xls" 

注意,如果.txt和.xls的內容將永遠保持不變,你可以LN改用CP的 - 一個文件,兩個人的名字。

+0

謝謝@Wayne,你想介紹一下這個方法嗎? 我做了一些搜索,$ BASH_REMATCH實際上包含所有'=〜'結果。那麼N部分呢? – Santa

+0

是的,$ BASH_REMATCH將是所有匹配的數組。但知道只有一個匹配,您可以使用$ BASH_REMATCH而不是$ {BASH_REMATCH [1]}。爲了改進腳本,應該實際將所有變量包含在雙引號中,並在使用$ BASH_REMATCH之前檢查匹配的失敗/成功返回。 N = $(...)部分只是刪除字符串「fixed」。從比賽中,只留下你想要的部分作爲文件名。 –

+0

哇謝謝@Wayne Vosberg,最後一件事,由於一些不可預見的情況,路徑有一些細微的變化,如上面更新中所示,我試過[[$ F =〜/'fixed.[^/]*「]]和[[$ F =〜/fixed.[//**]],都給出了相同的輸出匹配兩次的'固定'?!我可以知道如何獲得5個文件而不是10個文件嗎? – Santa