ここで基本名が機能しない理由 [複製]

ここで基本名が機能しない理由 [複製]

これを行うときに予想されるファイル名だけでなく、フルパスを返すのはなぜですか(わかっています。愚かなことです)。 ls -l | awk '{print $9}' | xargs -I% find ./my_dir -type f -name "%" -exec echo $(basename {}) \;

そして、はい、わかりました。愚かなことですが、目標はbasename {}を{}にCPすることです(そしてandではループを使用しましたfor i in $(ls); do find ./my_dir -type f -name $i -exec cp $i {} \;; done)。

ありがとうございます。

答え1

スペースを含むファイル名(たとえば)、またはスペースを含むユーザーまたはグループ名を持つシステム(Active Directoryに参加しているシステムなど)の場合、this one.txtコードは失敗します。

構造for i in $(ls)は次のとおりです未使用。代わりにワイルドカード globfor i in *を使用してください。

最後に質問に直接答えてください$(basename {})。この$( ... )値は一重引用符シェルで保護されていないため、評価されます。今後コマンドが実行されます。結果$(basename {})は簡単{}なので、

xargs -I% find ./my_dir -type f -name "%" -exec echo $(basename {}) \;

これを入力したように解析され、実行されます。

xargs -I% find ./my_dir -type f -name % -exec echo {} \;

似たようなものを探しているかもしれません。

for i in *
do
    find ./my_dir -type f -name "$i" -exec cp "$i" {} \; -quit
done

しなければならないことを忘れないでくださいいつも$変数と式を使用するときは二重引用符を使用してください。 (公平に言えば、この場合は役に立ちませんが、慣れるべき部分です。)

関連情報