5

.xml検索と置換を実行する必要のある拡張子を持つファイルがたくさんあるディレクトリAがあります。.xmlAには、Aの特定のファイルにリンクするいくつかのシンボリックリンク(拡張子も付いています)があります。実行しようとしsed -i 's/search_regexp/replacement_string/' *.xmlましたが、シンボリックリンクにヒットすると失敗します。

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

解決策は、実際に変更したいファイルをループして、各ファイルでsedを呼び出すことですが、sedにシンボリックリンクを無視するように指示する方法はありますか?または、それらに従って、リンクされたファイルを変更しますか?

4

2 に答える 2

4

@piokuc は、シンボリックリンクをたどるオプションにすでに名前を付けていますfind。最初にそれらを無視する方法は次のとおりです。

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

または、わずかに効率的です。

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

その! -type l部分は「シンボリックリンクではない」という意味です

于 2012-12-12T15:25:50.167 に答える
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 --> 
于 2012-12-12T15:10:55.213 に答える