このxargsコマンドが機能しないのはなぜですか?

このxargsコマンドが機能しないのはなぜですか?

すべての.sh拡張子を削除したいので、次のようにしました。

ls *.sh | xargs -I {} mv {} `basename {} .sh`

しかし、うまくいきません。basename変更されていないファイル名を返すかのように動作します。

なぜこれが起こるのですか?

たとえば、次のように動作します。

ls *.sh | xargs -I {} echo `basename {}.jpg .jpg`;

編集する:

回避策:一重引用符は、`basename ...`シェルが実行される前にコマンドを評価するのを防ぎます。

ls *.sh | xargs -I {}  sh -c 'mv {} `basename {} .sh`'

ベストアンサー1

これは、パイプラインが実行される前にbasenameコマンドが実行されるためです。これを行うには、basenameのxargsが必要です。sh -cたとえば、次を使用してこれを実行できます。

ls *.sh | xargs -L1 sh -c 'basename $1 .sh' dummy

メモ:

  • ファイル名をどこに挿入するのかわからない場合は、xargsコマンドラインの末尾に追加されます。
  • -L1スイッチまたはそれに対応するスイッチを使用する必要があるため、1つの引数xargsだけに渡してくださいsh
  • 使用される出力はls次のとおりです。副作用

編集する

TechZillaのおかげで廃止予定のオプションが削除されました。

おすすめ記事