다음과 같은 파일 구조가 있습니다.
- 00000010
- 000000001.파일1
- 000000001.파일2
- 00000020
- 00000003.file1
- 00000003.file2
- 00000003.file3
- ...
따라서 이름이 8자리 숫자로 시작하는 파일이 하나 이상 포함된 8자리 이름의 폴더가 있습니다. 하지만 이러한 파일 이름은 – 예를 들어 – 동기화되지 않았습니다. 이제 bash에서 재귀적으로 이름을 바꾸어 보관하려고 합니다.
- 00000010
- 000000010.파일1
- 000000010.파일2
- 00000020
- 00000020.file1
- 00000020.file2
- 00000020.file3
- ...
내 스크립트는 다음과 같습니다.
#! /bin/bash
find * -maxdepth 1 -name "*" -type d | while read -r dir
do
rename 's/$dir\/[0-9]{8}/$dir/' *
done
하지만 이것은 작동하지 않으며 다음과 같은 오류가 발생합니다.
전역 기호 "$dir"에는 (평가 1) 라인 1에 명시적인 패키지 이름이 필요합니다.
폴더 이름에 따라 파일 이름을 바꾸려면 어떻게 작성해야 합니까?
도와 줘서 고마워!
답변1
내가 배운 또 다른 답변에서와 마찬가지로
rename "s/$dir\/[0-9]{8}/$dir\/$dir/" $dir/*
누구든지 같은 문제가 있는 경우를 대비해...
답변2
$dir
나는 패턴에 보간되는 대답을 정말로 좋아하지 않습니다 . 예를 들어 디렉토리에 특수 정규식 토큰으로 해석되는 문자가 포함되어 있으면 예기치 않은 결과가 발생할 수 있습니다.
차라리 패턴에서 파일을 직접 일치시켜 디렉토리를 반복할 필요가 없고 일반 glob을 사용하는 것이 좋습니다.
rename 's#([^/]+)/[^/]+(\.file[0-9]+)$#$1/$1$2#' base_directory/*/*
glob이 디렉토리 내의 개별 파일에 도달하는 위치입니다( base_directory/*/*.file*
또는 유사하게 지정될 수도 있지만 여기서는 중요하지 않습니다).
이는 구성이 필요 없는 전체 명령입니다 find
.
- 패턴에서 이를 벗어나지 않도록
#
"일반" 대신 구분 기호로 사용합니다 ./
- "디렉토리 구분 기호가 아님"이라는 (탐욕스러운) 그룹과 디렉터리 구분 기호, 파일 이름 및 줄 끝을 캡처합니다. 이렇게 하면 첫 번째 캡처 그룹이 각 파일의 상위 디렉터리가 됩니다.
- 서수 접미사를 유지하기 위한 끝 부분을 제외하고 파일 이름의 첫 번째 부분은 삭제됩니다.
나는 파일의 길이가 모두 8자라고 가정하는 것보다 더 일반적인 접근 방식을 사용하기로 선택했습니다. 그러나 실제 차이점은 구문이 필요하지도 find
않고 변수를 (아마도 안전하지 않은) 정규식 환경에 밀어넣을 필요도 없다는 것입니다 $dir
.