2012-10-03 77 views
0

該腳本正確地找到我所需要的文件,並替換連續的空格用一個空格:散後重命名文件的sed -i

find . -type f -iname *-[0-9][0-9][0-9][0-9][0-9]-* ! -iname *.gz ! -iname *_processed -print0 | xargs -0 sed -i 's/ \+//g' 

我現在需要的是一個加上_parsed到每個文件的名的末尾,以便在下次運行此腳本時忽略這些文件。

這樣做的好方法是什麼?注意:這些文件沒有擴展名。文件名看起來像這樣:

./1923/338810-99999-1923 
./1921/999999-41406-1921 
./1953/320590-99999-1953 
./1911/241360-99999-1911 
./1923/307330-99999-1923 
./1983/802220-99999-1983 

編輯:我使用的是CentOS 6.基於Python的解決方案也可以。

+0

許多接受'-i'選項的seds接受可選擴展名,所以請嘗試| xargs sed -i「_parsed」's /...//''。許多人需要刪除將'-i'與擴展名分開的空格。首先在一個文件上測試它,右圖: - ?祝你好運。 – shellter

回答

2

如果你正在尋找一種方式來您當前的腳本相結合,將字符串的能力,你可以把你find的結果爲while循環,並在同一時間做兩(while代替for支持文件用空格,如果你需要這個條件 - 感謝@TimPote的提示):

find . -type f -iname *-[0-9][0-9][0-9][0-9][0-9]-* ! -iname *.gz ! -iname *_processed -print | while read file; do \ 
    sed -i 's/ \+//g' "$file"; \ 
    mv "$file" "${file}_parsed"; \ 
done 

的替代,只是重命名,是使用find-exec選項:

find . -type f -iname *-[0-9][0-9][0-9][0-9][0-9]-* ! -iname *.gz ! -iname *_processed -exec mv {} "{}_parsed" \; 

該命令將遍歷您的原始查找+替換命令找到的文件的相同列表,但是這次只會根據需要重命名它們。

+0

如果文件在路徑中的任何位置都有空格,則您的第一個解決方案將會中斷。我知道他說*文件看起來有某種特定的方式,但你不能太確定。一個更好的方法,使用相同的方法將是'find。 [...]同時讀取文件; ''find'確保每個文件都在一個新的行上,'read'每次只讀一行到變量'file'中。 –

+0

@TimPote我其實沒有想到這一點 - 誠摯的謝謝你的提示;我更新了我的答案,使用'while'而不是'for'! – newfurniturey

+0

@Tim Pote如果你不擔心文件名中的換行符,爲什麼要擔心文件名中的空格? –