
私が試したことは次のとおりです。
find . -name *.sv | xargs sed -i -e '<command>' -e '<command>'
これはうまくいきません。各ファイルに対してまったく同じコマンドを使用すると、まだ機能します。
助けてくれてありがとう。
答え1
xargs
一度に1つのファイルのみを強制的に実行するには、withを使用します。また、スペースなどを含むパス名が正しく処理されるように、usingがパス名を渡してwithを使用して受信する必要があります(およびこれらの非標準オプションをサポートしている場合)。また、(ディレクトリなどではなく)通常のファイルを探していることを指定する必要があり、シェルglobを引用する必要があります(または現在のディレクトリの一致するファイル名に拡張することができます)。sed
-n 1
xargs
find
-print0
xargs
-0
find
xargs
find . -type f -name '*.sv' -print0 | xargs -0 -n 1 sed -i -e '<command>' -e '<command>'
または以下を使用してくださいfind
。
find . -type f -name '*.sv' -exec sed -i -e '<command>' -e '<command>' {} ';'
関連:
を使用しないがfind
実行後に**
使用できるglobbingパターンを使用するソリューション(サブディレクトリまでの「再帰的」一致):bash
shopt -s globstar
shopt -s globstar dotglob nullglob
for pathname in ./**/*.sv; do
if [[ -f "$pathname" ]] && [[ ! -h "$pathname" ]]; then
sed -i -e '<command> -e '<command>' "$pathname"
fi
done
このループはファイル名のサフィックスを含むすべてのファイルを繰り返し、一致する各名前をテストしてコマンドを適用する前に通常のファイルであることを確認します(通常のファイルへのシンボリックリンクではないことを確認する.sv
には個別にテストする必要があります)。シェルオプションは()の使用を有効にし、一致する名前を隠すか()、一致しない場合はパターンを完全に削除します()。! -h
sed
**
globstar
dotglob
nullglob
または、デフォルトで有効になってzsh
いるシェルを使用し、**
「glob修飾子」を使用してbash
明示的に実行する必要があるほとんどの「追加」操作を実行できます。
for pathname in ./**/.sv(.DN); do
sed -i -e '<command> -e '<command>' "$pathname"
done
glob修飾子は(.DN)
古いワイルドカードパターンを変更し、通常のファイルとのみ一致し、隠された名前と一致し、まったく一致しない場合は何も拡張しないようにします。
答え2
私に役立つ別の方法は次のとおりです。
find -name "*.fail" | xargs -L 1 sed -i -e 's/cse/ecs/g' -e 's/trex/dino/g'
答え3
これは私にとって効果的です
grep -rl foo | xargs sed -i 's/foo/bar'