상위 폴더 이름에서 여러 파일의 이름을 바꾸는 쉘 스크립트

상위 폴더 이름에서 여러 파일의 이름을 바꾸는 쉘 스크립트

다음과 같은 파일 구조가 있습니다.

  • 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.

관련 정보