すべての.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`'
-iオプションに対応するデフォルトである場合を除き、正しくありませんが、これらの「クラシック」オプションは廃止されています。たとえば、オプション/行を1つだけ使用する場合、新しいPOSIXのマニュアルページではを推奨してい-L1ます。の古い動作を呼び出すため-iに、ページは-I'{}'オプションを推奨しています。