bash-3.2$ sed -i.bakkk -e "s#/sa/#/he/#g" .*
sed: .: in-place editing only works for regular files
フォルダ内のすべてのドットファイルに/ sa/with/he /を置き換えようとしています。どうすればそれを稼働させることができますか?Odd Sedエラーメッセージ
bash-3.2$ sed -i.bakkk -e "s#/sa/#/he/#g" .*
sed: .: in-place editing only works for regular files
フォルダ内のすべてのドットファイルに/ sa/with/he /を置き換えようとしています。どうすればそれを稼働させることができますか?Odd Sedエラーメッセージ
使用find -type f
は名前.*
に一致するだけファイルを見つけるとディレクトリ.
と..
を除外します。 -maxdepth 1
find
がサブディレクトリに再帰するのを防ぎます。次に-exec
を使用してsed
コマンドを実行し、{}
プレースホルダを使用して、ファイル名がどこにあるかをfind
に伝えます。それも変なファイル・スペースを含む名前、あるいは改行でうまくいくよう-exec
を使用して
find . -type f -maxdepth 1 -name '.*' -exec sed -i.bakkk -e "s#/sa/#/he/#g" {} +
はい、"foo bar\nfile"
は有効なファイル名である—バッククォートを使用したりxargs
以上が望ましいです。優秀な言及は、等しく安全なfind -print0 | xargs -0
find . -type f -maxdepth 1 -name '.*' -print0 | xargs -0 sed -i.bakkk -e "s#/sa/#/he/#g"
に行きます。それは、ファイル名が最後に行くコマンド(おそらく99%)のコマンドでしか機能しないので、もう少し冗長で柔軟性がありません。
グロブパターン.*
には、特別なディレクトリ.
と..
が含まれています。これはおそらくあなたのパターンに含めることを意味しませんでした。これは、すべてのディレクトリを無視すべきで
sed -i.bakkk -e "s#/sa/#/he/#g" `find .* -type f -maxdepth 0 -print`
(例えば、.elmファイル、.pine:
sed -i.bakkk -e "s$/sa/#/he/#g" $(ls -d .* | grep -v '^\.\|\.\.$')
+1。 find/xargsをおすすめします:find。 -type f -maxdepth 1 -name '。*' | xargs sed ... – pilcrow
はこの1つを試してみてください:私はそれらを除外するためのエレガントな方法を考えることはできませんので、ここで無粋な方法です、.mozilla)だけでなく。と私は他の解決策をキャッチしないと思う。
+最後に?それは ";"と同じですか? ? –
";"ファイルごとにコマンドを実行するので、10個のファイルに対して10個のsedsが実行されます。 "+"はファイルのすべて*を一度渡して実行し、10個のファイルに対して1 sedにします。 –
「rm。*」などのコマンドは、ドットファイルを削除するのが安全でないことを意味しますか?あなたが好むべきである:find。 -name "。*" -exec rm '{}' \; ? –