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