xargsの引数を使用して他の式を評価する方法は?

xargsの引数を使用して他の式を評価する方法は?

basename引数が与えられた式を評価したいと思いますxargs

私がテストしたものは次のとおりです。

find . -name '*.txt' | xargs -I f cp f DIR_OUT/copied_$(basename f)

きちんと評価されなかったno file or directoryからだ。$(basename f)

ファイル名をコピーして変更する2つのステップに分けられますが、xargs

ベストアンサー1

コマンドで使用されるコマンド置換は、コマンドが開始される前に一度だけ$(basename f)評価されます(文字列の生成)。これがコードがファイルを正しい名前にコピーしない理由です。fxargs

「該当するファイルまたはディレクトリがありません」というエラーは、見つかったファイルのパス名に置き換えられたためにf発生します。DIR_OUT/copied_ffind


同じことを行うより強力な方法

find . -type f -name '*.txt' -exec sh -c '
    for pathname do
        cp "$pathname" "DIR_OUT/copied_${pathname##*/}"
    done' sh {} +

または、見つかったパス名を間にNULLで終わる文字列として渡すようにxargs注意してください。findxargs

find . -type f -name '*.txt' -print0 |
xargs -0 sh -c '
    for pathname do
        cp "$pathname" "DIR_OUT/copied_${pathname##*/}"
    done' sh

両方のバリエーションで、指定されたパス名を繰り返し、それをディレクトリの下の新しい名前にコピーする小さなインラインシェルスクリプトを呼び出しますDIR_OUT${pathname##*/}に置き換えることができます$( basename "$pathname" )

-print0(in find)と-0(in)はxargs非標準ですが、一般的に実装されています。

関連:

おすすめ記事