예를 들어 파일 이름:
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,1
8번째 문자를 나타냅니다. - 비어 있지 않은 경우
$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