私は直面しているこの問題を解決するためにSOで言及されているさまざまなソリューションを試しました。
すべてのファイルを再帰的に見つけ、いくつかのテキストを変更したいと思います。
これはWindowsのcygwinで使用されるコマンドです。
find . -not -path \*.hg\* -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;
私が得た結果は
sed: couldn't edit ./xxx/yyy/filename: not a regular file
ここで何か抜けましたか?
答え1
find
すべてのファイルとすべてのディレクトリのリストを返します。実際に文字列を含むファイルを見つけるには、検索を制限する必要があります。以下を追加してみてください。
find -type f ... # Doesn't return directories
find -iname "*.txt" ... # returns only files ending in '.txt' (case insensitive)
あるいは、本当に豪華になりたい場合は、grepを使用して実際に文字列を含むファイルでのみsedを実行できます。
grep -l -r 'FCLP1025' | xargs sed -i 's/FCLP1025/FCLP1080/g'
grepは-r
再帰的に検索し、-l
一致するファイルのファイル名のみを一覧表示します。次に、を使用する場合と同様に、xargs
stdinを使用して次のコマンドに引数として追加します。{}
find -exec cmd {} \;
しかし、Linuxのbashでテストされているので、うまくいかない場合は、grep --help
git-bash / cygwinでフラグが異なることを確認できます。しかし、通常は同じです。
答え2
あなたのコマンドはディレクトリ(および他の非正規ファイル)を見つけることができます。ディレクトリは使用できませんsed
。
-type f
コマンドにテストを追加すると、通常のファイルのみがfind
処理されます。
find . -type f -not -path \*.hg\* -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;
または、標準find
オプションとより読みやすい引用を使用してください。
find . -type f ! -path '*.hg*' -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;
ディレクトリを完全にスキップするには、次のように.hg
検索-prune
パスからそのディレクトリを削除しますfind
。
find . -name .hg -prune -type f -exec sed -i 's/FCLP1025/FCLP1080/g' {} \;
find
これにより、というディレクトリに入ることさえ不可能になりました.hg
。注文会議このようなディレクトリに行き、その中のすべてをテストするのは-path
少し非効率的です。
内部編集では、診断メッセージがない限り端末に出力が生成されないため、コマンドfind
の出力はありません。出力は編集したファイルに入ります。sed -i
sed
sed -i
また、上記の最後のコマンドはfind
編集を試みます。すべて文書。編集するファイルの名前がわかっている場合は、そのファイルのみを実行するように-name 'some pattern'
制限する前に追加できます。-exec
sed