2012-12-12 208 views
4

我有一個目錄A,帶有一大堆.xml擴展名的文件,我需要運行搜索和替換。有一對夫婦的符號鏈接(也.xml擴展名)在一個鏈接到特定的文件A.我試圖運行sed -i 's/search_regexp/replacement_string/' *.xml但是當它擊中失敗一個符號鏈接與有沒有辦法告訴sed忽略符號鏈接?

sed: ck_follow_symlink: couldn't lstat file.xml: No such file or directory 

一個解決方案是圍繞循環文件,我真的想修改和調用每個文件sed,但有沒有辦法告訴sed忽略符號鏈接?或者只是按照他們並修改鏈接的文件?

回答

3

@piokuc已命名的選項下面的符號鏈接,你可以先用find來忽略它們:

find /path/to/dir/ -type f -name "*.xml" ! -type l -exec sed -i 's/search_regexp/replacement_string/' {} \; 

或者sligh TLY更高效:

find /path/to/dir/ -type f -name "*.xml" ! -type l | xargs sed -i 's/search_regexp/replacement_string/' 

! -type l部分的意思是「沒有什麼是一個符號鏈接」

+0

是否將符號鏈接視爲「常規文件」(屬於'-type f')?我使用'-type f'運行find命令(不帶'!-type l'),它過濾掉了符號鏈接。我想知道如果'! 「型l」實際上是需要的。 –

+0

@ fo_x86這也是我的懷疑(你只需要'-type f'),但我認爲最好是安全的。 –

2

有該選項(man sed):

 --follow-symlinks 

      follow symlinks when processing in place 

sed的我使用的版本是4.1.5:

ariadne{/tmp}:310 --> sed --help | grep follow 
    --follow-symlinks 
       follow symlinks when processing in place 
ariadne{/tmp}:311 --> sed --version   
GNU sed version 4.1.5 
Copyright (C) 2003 Free Software Foundation, Inc. 
This is free software; see the source for copying conditions. There is NO 
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE, 
to the extent permitted by law. 
ariadne{/tmp}:312 --> uname -a 
Linux ariadne 2.6.34.10-0.6-desktop #1 SMP PREEMPT 2011-12-13 18:27:38 +0100 x86_64 x86_64 x86_64 GNU/Linux 
ariadne{/tmp}:313 --> 
+0

,則該選項新在sed 4.2?我正在使用4.1.5(我很想更新,但我公司的系統管理員拒絕)。我在其他地方閱讀過這個選項,但是我沒有在手冊頁中看到它。 –

+0

我有4.1.5,選項有 – piokuc

+0

@ fo_x86不知道,也許這個版本沒有配置選項?我在我的答案中添加了關於我的'sed'版本的信息。 – piokuc

相關問題