ディレクトリのファイルとその名前を処理します。

ディレクトリのファイルとその名前を処理します。

私は初めてターミナルの世界に触れ、ディレクトリのいくつかの画像を処理したいと思います。いくつかの画像の例は次のとおりです(Fog Cityscapesデータセットから取得)。

frankfurt_000000_000294_leftImg8bit_foggy_beta_0.01.png
frankfurt_000000_000294_leftImg8bit_foggy_beta_0.02.png
frankfurt_000000_000294_leftImg8bit_foggy_beta_0.005.png
munster_000000_000019_leftImg8bit_foggy_beta_0.01.png
munster_000000_000019_leftImg8bit_foggy_beta_0.02.png
munster_000000_000019_leftImg8bit_foggy_beta_0.005.png

部分名は_leftImg8bit_foggy_beta_すべての画像に共通であり、前の部分は他の画像を識別するために使用されます。まず、このイメージをサフィックスbeta0.01、0.02、または0.005を使用して3つの別々のサブディレクトリに分割したいと思います。ファイルを分割した後、拡張子を_leftImg8bit保持しながら、サブディレクトリのファイル名の後にあるすべてのファイル名を削除したいと思います。.png

私はLinux(特にCentOs)ターミナルコマンドに慣れていないので、誰でも助けることができますか?よろしくお願いします。

答え1

そしてzsh

autoload -Uz zmv # best in ~/.zshrc
mkmv() { mkdir -p -- $2:h && mv -- "$@"; }
zmv -n -P mkmv '(*)_leftImg8bit_foggy_beta_(*)(.png)' '$2/$1$3'

-n満足した場合は削除(模擬実行))。

または、POSIXに似たシェルを使用してください(保護はありませんがzmv)。

for file in *_leftImg8bit_foggy_beta_*.png; do
  dir=${file#*_leftImg8bit_foggy_beta_}
  dir=${dir%.*}
  mkdir -p -- "$dir" &&
    mv -- "$file" "${file%%_leftImg8bit_foggy_beta_*}.png"
done

関連情報