내 파일의 파일 이름은 다음과 같습니다.
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_text_693_coff_432.jpg Text_2_ 2022-1 1-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_832.jpg text_2_2022-1 k_ 66_P578_B06_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