find 명령의 확장 매개변수의 첫 번째 문자를 가져옵니다.

find 명령의 확장 매개변수의 첫 번째 문자를 가져옵니다.

이미지가 너무 많아서 처음 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 {} +

관련 정보