バイナリファイルを除いて、ディレクトリのファイルパスを繰り返し置き換えます。

バイナリファイルを除いて、ディレクトリのファイルパスを繰り返し置き換えます。

ディレクトリ内のファイル(バイナリファイルを除く)の文字列(位置パス)を再帰的に置き換える方法は?私はコマンドを試しました

find . -type f -exec sed -i 's/foo/bar/g' {} +

ただし、バイナリファイルやその他のファイル(* .o、* .c)の文字列も置き換えられます。 「.dependent」という名前のすべてのファイルで文字列を再帰的に変更したいと思います。

答え1

find . -type f -name "*.depend" -exec sed -i 's/foo/bar/g' {} +

または

find . -type f -not -name "*.c" -not -name "*.o" -exec sed -i 's/foo/bar/g' {} +

       -name pattern
              Base of file name (the path with the leading directories
              removed) matches shell pattern pattern.  Because the leading
              directories are removed, the file names considered for a match
              with -name will never include a slash, so `-name a/b' will
              never match anything (you probably need to use -path instead).
              A warning is issued if you try to do this, unless the
              environment variable POSIXLY_CORRECT is set.  The
              metacharacters (`*', `?', and `[]') match a `.' at the start
              of the base name (this is a change in findutils-4.2.2; see
              section STANDARDS CONFORMANCE below).  To ignore a directory
              and the files under it, use -prune; see an example in the
              description of -path.  Braces are not recognised as being
              special, despite the fact that some shells including Bash
              imbue braces with a special meaning in shell patterns.  The
              filename matching is performed with the use of the fnmatch(3)
              library function.  Don't forget to enclose the pattern in
              quotes in order to protect it from expansion by the shell.

http://man7.org/linux/man-pages/man1/find.1.html

答え2

私はこのコードを書いており、それは私の目的に適しています。

find . -type f -exec grep -Iq . {} \; -exec sed -i 's|/foo|/bar|g' {} +

関連情報