ループを使わずにLinuxで複数のファイルの拡張子を削除する[閉じる]

ループを使わずにLinuxで複数のファイルの拡張子を削除する[閉じる]

サンプルファイル:

RBFATL001USCGA002.--K1234--
RCAVTL001USCGA043.--K2135--

出力:

RBFATL001USCGA002
RCAVTL001USCGA043

答え1

常にサイクルがあります。たぶんループを隠すツールが欲しいということでしょうか?

perlその後、s renameprenameまたはとも呼ばれる)を使用できますperl-rename

rename 's/\.[^.]+\.*\z//s' ./*.*

または、zsh次のようになりますzmv

autoload zmv
zmv '(*).[^.]##.#' '$1'

デフォルトでは、これらのファイルは隠しファイル(名前で始まるファイル)の名前を変更しません.。これらも処理するには、次のようにします。

zmv '(?*).[^.]##.#(#qD)' '$1'

.foo.bar.に拡張があると思う人(そして拡張がないと.bar.思う人)。 ()foo...に変更を検討したい場合は、これを調整してください。私はあなたがそれを考慮したくないと思います(これは削除されます(しかしファイル名が空になることができないので失敗します))。.zmv '(?*).*(#qD)' '$1'.foo.bar.zmv '*(#qD)' '${f%%.*}'

また、file.tar.gz拡張は考慮されて.gzいないと見なされます.tar.gz

これを再帰的に実行します。

zmv '(**/)(?*).[^.]##.#(#qD)' '$1$2'

または以下を使用してrename

find . -depth -name '?*.*' -exec rename 's/\.[^./]+\.*\z//s' {} +

答え2

ループを使わずにこれを行う方法は次のとおりです。

find . -type f -name "?*.*" -exec sh -c 'mv -v "$0" "${0%.*}"' '{}' \;

関連情報