2013-02-18 22 views
0

我想爲我的包創建spec文件。 要列出我使用find命令,並將其重定向到一個文件中的文件:SED和整行

readonly TOPDIR=`pwd` 
cd package_folder 
find . -iname >>$TOPDIR/list_files 

現在我的問題是我需要添加前綴%dir否則我得到的文件列出了兩次錯誤的每個目錄。 我的文件的假設內容是:

$ cat list_files 
/bin 
/bin/file_a 
/bin/my_folder 
/bin/my_folder/file_b 

我所做的就是尋找目錄的

for file_name in `cat $TOPDIR/list_files` 
do 
    chk_1=`ls -l $file_name |grep "^d"` 
    if [ "chk_1" ] ;then 
    sed -i "[email protected]^[email protected]%dir [email protected]" $TOPDIR/list_files 
    fi 
done 

現在我的輸出文件(list_files)看起來是這樣的:

%dir /bin 
%dir /bin/file_a 
%dir /bin/my_folder 
%dir /bin/my_folder/file_b 

原因是/bin是一個目錄,因此它將/bin替換爲%dir。 嗯,這有點奇怪,因爲我沒有給出@g選項,但它仍然取代所有/bin。 有沒有辦法在sed中包含"\n"

回答

0

使用當前的技術,確保該模式與$整條生產線相匹配,以紀念該行的末尾:

sed -i "[email protected]^$file_name\[email protected]%dir [email protected]" $TOPDIR/list_files 

需要反斜槓,以防止擴大[email protected]外殼; sed沒有看到反斜槓。

+0

謝謝你的工作..現在我知道我的邏輯去尋找dir是錯誤的:D – mage 2013-02-18 06:08:50

+0

正確的邏輯是:chk_1 = \'ls -l \''dirname $ file_name \\'| grep -w \\' basename $ file_name \\'| grep「^ d」\' – mage 2013-02-18 06:24:47

1

你的腳本很容易出錯。使用這個來代替:

while IFS= read -r file_name 
do 
    [ -d "$file_name" ] && pfx="%dir " || pfx="" 
    printf "%s%s\n" "$pfx" "$file_name" 
done < "$TOPDIR/list_files" > tmp && 
mv tmp "$TOPDIR/list_files" 

它會包含空格,製表符,@符號,反斜槓,等等等等保護你的文件名,如果你的空間用完會阻止你破壞原始文件tmp文件(sed在飛行中創建)。

+0

謝謝:),幸運的是我的所有文件都沒有@,空格等,但是我會添加這個 – mage 2013-02-21 11:02:24

+0

done <「$ TOPDIR/list_files」> tmp && 什麼是使用這些線? – mage 2013-02-21 17:17:26

+0

'cmd < file > tmp && mv tmp file'是如何修改原始文件的內容並在該文件上運行命令的結果。 '> tmp'告訴shell將stdout重定向到一個tmp文件,'&& mv tmp file'告訴shell在原始命令('cmd')成功時執行'mv'命令。 – 2013-02-21 19:12:38