xargsを介したパイプ出力の検索を使用してファイルリストから複数のsedコマンドを実行する方法

xargsを介したパイプ出力の検索を使用してファイルリストから複数のsedコマンドを実行する方法

私が試したことは次のとおりです。

find . -name *.sv | xargs sed -i -e '<command>' -e '<command>'

これはうまくいきません。各ファイルに対してまったく同じコマンドを使用すると、まだ機能します。

助けてくれてありがとう。

ベストアンサー1

xargs一度に1つのファイルのみを強制的に実行するには、withを使用します。また、スペースなどを含むパス名が正しく処理されるように、usingがパス名を渡してwithを使用して受信する必要があります(およびこれらの非標準オプションをサポートしている場合)。また、(ディレクトリなどではなく)通常のファイルを探していることを指定する必要があり、シェルglobを引用する必要があります(または現在のディレクトリの一致するファイル名に拡張することができます)。sed-n 1xargsfind-print0xargs-0findxargs

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パターンを使用するソリューション(サブディレクトリまでの「再帰的」一致):bashshopt -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には個別にテストする必要があります)。シェルオプションは()の使用を有効にし、一致する名前を隠すか()、一致しない場合はパターンを完全に削除します()。! -hsed**globstardotglobnullglob

または、デフォルトで有効になってzshいるシェルを使用し、**「glob修飾子」を使用してbash明示的に実行する必要があるほとんどの「追加」操作を実行できます。

for pathname in ./**/.sv(.DN); do
    sed -i -e '<command> -e '<command>' "$pathname"
done

glob修飾子は(.DN)古いワイルドカードパターンを変更し、通常のファイルとのみ一致し、隠された名前と一致し、まったく一致しない場合は何も拡張しないようにします。

おすすめ記事