名前の一部に基づいてファイルをサブフォルダに移動する

名前の一部に基づいてファイルをサブフォルダに移動する

私のファイルのファイル名は次のとおりです。

Text_2_2022-11-22_K03_10k_66_P578_B06_2999dl_text_693_coff_442.jpg Text_2_2022-11-22_K03_10k_66_P578_B06_2999dl_2_text -22_K05_10k_66_P578_B06_2999dl_text_693_coff_175.jpg text_2_2022-11-22_K05_10k_66_P578_B06_2999dl_text_693_coff_83 2999dl_text_693_coff_322.jpg text_2_2022-11- 22_K08_10k_66_P578_B06_2999dl_text_693_coff_975.jpg

次のサブフォルダを作成したいと思います。

K03_10k_66_P578_B06
K05_10k_66_P578_B06
K08_10k_66_P578_B06

次に、ファイルを正しいサブフォルダに移動します。

その他回答パラメータ拡張を使用しますが、より複雑な名前を使用すると、これを行う方法がわかりません。そのため、ファイル名の必須部分と一致するようにgrep / regexコマンドを作成しましたが、ループではこれを達成できませんでした。

grep '[A-Z][0-9]*_[0-9]*[a-z]_[0-9]*_[A-Z][0-9]*_[A-Z][0-9]*'

同様の回答が見つかりました(1 2 サム 4)私の問題について説明しましたが、私のファイル名はこれらの問題よりも複雑です。

ベストアンサー1

これは、bashのパラメータ拡張を使用してファイル名を複数の部分に分割し、その部分をサブフォルダ名に再結合するのに効果的でした。

# get list of .jpg files to work on
shopt -s nullglob
file_list=( *.jpg )

# quick exit if there are no files
[[ ${#file_list[@]} -lt 1 ]] && {
  echo 'No *.jpg files found' >&2
  exit 1
}

# handle each file in the list
for orig_fname in "${file_list[@]}"
do
  # get filename without .xyz suffix
  fname="${orig_fname%.*}"

  # split file name into parts on underscores
  IFS=_ fname_parts=( $fname )

  # join parts 3,4,5,6,7 into the subfolder name
  # note: includes trailing _ in name
  printf -v subfolder '%s_' "${fname_parts[@]:3:5}"
  subfolder="${subfolder%_}"  # strip trailing _ from name

  # create subfolder if needed
  mkdir -v -p "$subfolder"

  # move file to its subfolder
  mv -v "$orig_fname" "$subfolder"
done

その情報が画面全体をスクロールしたくない場合は、コマンドから-vコマンドmkdirを削除してください。mv

おすすめ記事