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)
評価されます(文字列の生成)。これがコードがファイルを正しい名前にコピーしない理由です。f
xargs
「該当するファイルまたはディレクトリがありません」というエラーは、見つかったファイルのパス名に置き換えられたためにf
発生します。DIR_OUT/copied_f
find
同じことを行うより強力な方法
find . -type f -name '*.txt' -exec sh -c '
for pathname do
cp "$pathname" "DIR_OUT/copied_${pathname##*/}"
done' sh {} +
または、見つかったパス名を間にNULLで終わる文字列として渡すようにxargs
注意してください。find
xargs
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
非標準ですが、一般的に実装されています。
関連: