この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のおかげで廃止予定のオプションが削除されました。

答え2

あなたの質問についてはよくわかりません。最初の行がうまくいかない理由を本当に尋ねますか?または、すべての.shファイルの名前を変更する正しい方法をお探しですか?

これが最もきれいな方法であると仮定するとxargs。 .shファイル拡張子を削除するために、私はしばしばこの方法を検討します。

 find -maxdepth 1 -type f -iname '*.sh'  | sed 'p;s_.sh$__' | xargs -L2 mv

関連情報