이런 파일이 잔뜩 있어요
5830_1.png
5830_2.png
5830_3.png
5831_1.png
5832_1.png
5832_2.png
이 파일들을 모두 파일 이름 접두어를 디렉터리 이름으로 사용하여 디렉터리로 정렬하고 싶습니다.
그래서 나는 끝낼 것이다
5830/
5830_1.png
5831_2.png
...etc
5831/
5832/
찾을 수 있는 단축키가 있나요?
답변1
POSIX sh
라인:
for file in *.png; do mkdir -p -- "${file%%_*}" && \
mv -- "$file" "${file%%_*}"; done
설명하다:
.png
현재 디렉터리의 각 파일을 반복합니다 .mkdir
파일 접두사를 사용하고${file%%_*}
첫 번째 밑줄과 그 뒤의 모든 항목을 제거하여-p
디렉터리가 이미 존재하는 경우 자동으로 유지됩니다.mkdir
mv
파일을 디렉터리에 넣습니다.
아래 HalosGhost의 제안에 따라 원하는 최종 구조가 다음과 같은 경우
5830/
1.png
2.png
3.png
5831/
1.png
5832/
1.png
2.png
위의 줄은 약간 수정될 수 있습니다:
for file in *.png; do mkdir -p -- "${file%%_*}" && \
mv -- "${file}" "${file%%_*}/${file##*_}"; done
이번에는 대상이 디렉터리 ${file%%_*}
( $file
밑줄 앞)와 새 파일 이름 ${file##*_}
( $file
밑줄 뒤)으로 구성됩니다.
답변2
나는 여러 장의 서류를 정리하기 위해 이런 일을 여러 번 해야 했습니다. 나는 bash 변수 확장이 당신의 친구라는 것을 알았습니다.
${parameter%word}
${parameter%%word}
일치하는 접미사 패턴을 제거합니다. 경로 이름 확장과 마찬가지로 단어가 확장되어 패턴을 생성합니다.
기본 설정:
-rw-r--r-- 1 falsenames falsenames 0 Jun 5 17:35 5830_1.png
-rw-r--r-- 1 falsenames falsenames 0 Jun 5 17:35 5830_2.png
-rw-r--r-- 1 falsenames falsenames 0 Jun 5 17:35 5830_3.png
-rw-r--r-- 1 falsenames falsenames 0 Jun 5 17:35 5831_1.png
-rw-r--r-- 1 falsenames falsenames 0 Jun 5 17:35 5832_1.png
-rw-r--r-- 1 falsenames falsenames 0 Jun 5 17:35 5832_2.png
$ for i in $(find . -maxdepth 1 -type f); do mkdir -p ${i%_*};mv -v $i ${i%_*}; done
'./5830_3.png' -> './5830/5830_3.png'
'./5831_1.png' -> './5831/5831_1.png'
'./5830_1.png' -> './5830/5830_1.png'
'./5832_1.png' -> './5832/5832_1.png'
'./5832_2.png' -> './5832/5832_2.png'
'./5830_2.png' -> './5830/5830_2.png'
더 구체적인 정보를 얻으려면 find에서 "-name *png" 또는 다른 플래그를 사용할 수도 있습니다. 지정된 디렉터리에서만 조회를 확인하도록 maxlength를 설정하여 실행했습니다. 이렇게 하면 디렉토리에 더 많은 이미지가 추가되면 수정 없이 다시 실행됩니다. 또한 %% 대신 %를 사용하므로 밑줄을 포함하여 전체 디렉토리를 지정해야 하는 경우(예: "/home/user/my_files/pngs") 이 기능이 중단되지 않습니다.
$ for i in $(find move_files -maxdepth 1 -type f); do mkdir -p ${i%_*};mv -v $i ${i%_*}; done
'move_files/5830_3.png' -> 'move_files/5830/5830_3.png'
'move_files/5831_1.png' -> 'move_files/5831/5831_1.png'
'move_files/5830_1.png' -> 'move_files/5830/5830_1.png'
'move_files/5832_1.png' -> 'move_files/5832/5832_1.png'
'move_files/5832_2.png' -> 'move_files/5832/5832_2.png'
'move_files/5830_2.png' -> 'move_files/5830/5830_2.png'