파일을 알파벳 및 숫자 폴더로 정렬하는 Bash 스크립트(8번째 문자로 정렬 문자 오프셋)

파일을 알파벳 및 숫자 폴더로 정렬하는 Bash 스크립트(8번째 문자로 정렬 문자 오프셋)

예를 들어 파일 이름: 9323 - Unix.ext또는z223 - 50 Cent.ext

현재 디렉토리의 모든 파일을 ./A 및 ./B 등과 ./Numbers로 정렬하는 방법을 알고 싶지만 파일 이름의 8번째 문자를 비교 변수로 사용합니다.

"U"와 "5"는 위의 예에서 정렬 기준이 되는 변수입니다.

감사해요

답변1

rename  -n 'if (-f $_) {
   my $c=substr($_,7,1);
   if ($c) {
     mkdir $c unless (-d $c);
     $_="$c/$_" if (-d $c);
   };
}' *.ext

이는 다음을 사용합니다.진주 rename 명령( prename및 라고도 함 file-rename),아니요완전히 다르고 호환되지 않는 명령줄 옵션이 있는 명령과 rename혼동됩니다 .util-linux

스크립트는 명령줄의 모든 파일을 반복하고(또는 STDIN에서 읽음) 현재 파일이 일반 파일(예: 디렉터리, 명명된 파이프, 소켓 등이 아닌 경우)인 경우 다음을 수행합니다.

  • 이 함수를 사용하여 8번째 문자를 substr()$c 변수로 추출합니다. substr 오프셋은 0부터 시작하므로 ,7,18번째 문자를 나타냅니다.
  • 비어 있지 않은 경우 $c(짧은 파일 이름의 경우 발생) 다음을 수행합니다.
    • $c디렉터리가 없으면 만듭니다.
    • 현재 파일이 디렉터리인 경우 해당 디렉터리로 이름을 바꿉니다(즉, $c이미 존재하지만 디렉터리가 아닌 경우 중단되지 않습니다).

Misc또는 스크립트는 예를 들어 $c가 비어 있는 경우 다음과 같은 디렉터리로 파일을 이동할 수 있습니다 .

rename -n 'if (-f $_) {
   my $c=substr($_,7,1);
   $c="Misc" unless ($c);
   mkdir $c unless (-d $c);
   $_="$c/$_" if (-d $c);
}' *.ext

참고: 위의 두 예 모두 rename시험 실행 옵션( -n)을 사용합니다. 허용하는 경우 이름이 변경되거나 MV로 편집될 파일의 ​​내용만 표시됩니다. 이름 바꾸기 스크립트가 원하는 작업을 수행하는 것에 만족하면 옵션을 제거하십시오 (또는 자세한 출력으로 -n바꾸십시오 ).-v

예를 들어

$ rename -v  'if (-f $_) { my $c=substr($_,7,1);  $c="Misc" unless ($c) ; mkdir $c unless (-d $c); $_="$c/$_" if (-d $c)}'  *
9323 - Unix.ext renamed as U/9323 - Unix.ext
foo.ext renamed as Misc/foo.ext
z223 - 50 Cent.ext renamed as 5/z223 - 50 Cent.ext

관련 정보