我有以下bash腳本。從當前目錄中的某個類型的所有文件中刪除最後n行,遞歸
for i in **/*.h; do head $i -n -2 > $i.tmp && mv $i.tmp $i -f; done
其目的是運行當前目錄中的每個.h文件,並從該文件中刪除最後兩行。
但是,這隻能按照預期方式在直接位於當前目錄的子文件夾中的文件上工作,但它不處理子文件夾等子文件夾內的文件,所以./foo/foobar.h會被處理,但./foo/bar/foobar.h或for/bar/foobar/.foobar.h不。
爲此我已經嘗試過這種方式:
for i in 'find -name *.h'; do head $i -n -2 > $i.tmp && mv $i.tmp $i -f; done
這失敗,因爲> $ i.tmp是模糊的
應該怎樣我的腳本的外觀,使其處理目錄中的所有頭文件,不管它們在子文件夾中的嵌套程度如何?
編輯: 如果直接EOF之前的原始文件一直沒有一個換行符,工作第一腳本從上面(也從答案的sed替代)將增加一個,所以如果EOF之前換行不需要的話,它已被刪除後:
for i in **/*.h; do head $i -n -2 > $i.tmp && mv $i.tmp $i -f && truncate --size=-2 $i; done
大小應該是-2 CRLF(視窗風格)換行和-1兩個,CR(舊的MacOS風格)和LF(UNIX風格),行尾
當然這種方法也會在eof之前刪除一個換行符,這個換行符已經在
之前如果你有 bash4和shopt -s globstar
啓用
確實:作品像一個魅力。 – Kaiserludi 2013-04-04 19:01:21
btw:你有什麼想法,爲什麼globstar在bash4中默認沒有啓用? – Kaiserludi 2013-04-04 19:02:06
取決於您的發行設置和您自己的設置。它在archlinux上默認啓用。 – 2013-04-04 19:19:02