디렉터리에 "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