私のファイルのファイル名は次のとおりです。
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