Bash - 주어진 정규식 패턴을 포함하는 모든 파일의 이름을 바꿉니다.

Bash - 주어진 정규식 패턴을 포함하는 모든 파일의 이름을 바꿉니다.

디렉터리에 "HG-U133A" 또는 "HG-U133B" 문자열이 포함된 일부 파일이 있습니다. 디렉터리에 있는 모든 파일을 살펴보고 "A_" 접두사가 있는 모든 "HG-U133A" 파일과 "B_" 접두사가 있는 모든 "HG-U133B" 파일의 이름을 바꿀 수 있는 스크립트를 작성하고 싶습니다.

따라서 이것이 내 디렉토리에 있는 파일이라면

> grep "HG-U133[AB]" *
fileA.txt: HG-U133A
fileB.txt: HG-U133A
fileC.txt: HG-U133B
fileD.txt: HG-U133A
fileE.txt: HG-U133B

이 파일의 이름을 다음으로 바꿀 수 있는 스크립트를 작성하고 싶습니다.

> ls
A_fileA.txt
A_fileB.txt
B_fileC.txt
A_fileD.txt
B_fileE.txt

이 문제에 대해 도움을 주시면 정말 감사하겠습니다. 감사합니다

답변1

이것은 다음과 같은 문제에 빠지지 않는 휴대용 솔루션입니다.배쉬 함정 번호 1.

for file in *; do
  [ -f "$file" ] || continue
  grep -q -- HG-U133A "$file" && { mv -- "$file" "A_$file"; continue; }
  grep -q -- HG-U133B "$file" && mv -- "$file" "B_$file"
done

노트:

  • *도트 파일과 일치하지 않지만 호출에 사용했으므로 grep동작이 자신에게 적합하거나 변경 방법을 알고 있다고 가정합니다.
  • *디렉토리와 일치합니다. grep프로세스 디렉터리를 만들 수 있는 옵션 없이 호출되었습니다 . 스크립트는 일반 파일이 아닌 모든 항목을 건너뛰며 이의 주요 목적은 디렉터리를 건너뛰고 grep해당 디렉터리에 대해 실행을 방해하지 않는 것입니다(어쨌든 실패합니다).
  • 이중 대시( --)에 대한 설명은 다음과 같습니다.--(이중 대시)은(는) 무슨 뜻인가요 ? (“기본 이중 대시”라고도 함)?파일 이름이 대시로 시작하는 경우입니다. ./*대신 사용한다면 *필요하지 않을 것입니다.
  • "... 또는 ..."라고 말씀하셨는데, 저는 이것을 "주어진 파일에 대해 최대 하나의 문자열이 일치합니다"라고 해석합니다. 따라서 continue첫 번째 grep. 두 번째 전화를 grep헛되이 하지 않기 위해 거기에 있습니다 .
  • 파일이 많을 것으로 예상되고 파일 HG-U133B수가 적을 경우 먼저 HG-U133A테스트를 고려하십시오 HG-U133B.

장점:

  • 이식성,
  • 견고성(코드는 파일 이름에 관계없이 잘 작동해야 함)

불리:

  • 일반 파일당 하나 이상의 grep프로세스를 생성하는 것은 최적이 아닙니다. 검사할 파일이 너무 많으면 속도가 느려질 수 있습니다.

답변2

다음 명령이 bash이를 수행합니다:

for file in `grep -l HG-U133A *` ; do mv "$file" "A_$file" ; done
for file in `grep -l HG-U133B *` ; do mv "$file" "B_$file" ; done

관련 정보