이미지가 너무 많아서 처음 3자 + .jpg 확장자와 일치하는 폴더에 넣고 싶습니다.
4_1_0002.png
그래서 파일(4_1로 시작하는 모든 파일)을 가져와서 4_1_.jpg
폴더 에 넣고 싶습니다 . 마찬가지로 파일(4_2로 시작하는 모든 파일)을 가져와서 폴더 4_2_0002.png
에 넣고 싶습니다 .4_2_.jpg
정렬하려는 모든 파일은 이제 하나의 거대한 폴더에 있습니다. find 명령을 사용하려고 하는데 {} 확장 매개변수에서 처음 세 문자를 추출하는 방법을 모르겠습니다.
find . -type f -ok echo mv {} "path/first3char.jpg" \;
답변1
파일 이름을 더 쉽게 바꿀 수 있는 도구가 있습니다. 예를 들어 Perl rename
구현을 사용하면 일반적으로 다음 이름을 사용합니다 prename
.
prename '$dir = substr($_,0,3); mkdir $dir; $_ = "$dir/$_"' *.jpg
디렉토리가 이미 존재하는 경우 다음과 같이 단순화할 수 있습니다.
prename 's!(...)!$1/$1!' *.jpg
prename
예를 들어 배포판에 하나가 포함되어 있지 않은 경우 하나를 설치하십시오.유니코드::싸움또는파일::이름 바꾸기.
find
파일이 모두 동일한 디렉토리에 있기 때문에 여기서는 유용하지 않을 수 있습니다. 그러나 명령줄이 너무 길어서 오류가 발생할 수 있습니다. find
이 문제를 해결하는 한 가지 방법을 사용할 수 있습니다.
find -maxdepth 1 -name '*.jpg' -exec prename 's!(...)!$1/$1!' {} +
또는 다음을 실행하십시오.다루기 힘든bash 대신 활용하세요zmv
기능.
autoload zmv # you can put this in ~/.zshrc
mkdir_mv () {
mkdir -p -- $2:h
mv -- $1 $2
}
zmv -p mkdir_mv '(???)*.jpg' '$1/$f'
디렉토리가 이미 존재하는 경우 다음을 사용할 수 있습니다.
zmv '(???)*.jpg' '$1/$f'
답변2
src="/pathto/large_folder"
dest="/tmp/3chars"
mkdir -p "$dest" || exit 1
cd "$src" && \
find . -type f -name '???*' -exec sh -c '
for f
do
b=${f##*/}
d=${b%"${b#???}"}_.jpg
[ -d "$dest/$d" ] || mkdir -p "$dest/$d"
mv "$f" "$dest/$d/."
done
' x {} +