[Linux] 셸 은 sed 를 이용 하여 파일 이름 을 대량으로 변경 하 는 방법 에 대한 자세 한 설명 | 정규 표현 식 을 사용 하지 않 고 알 수 없 는 파일 이름 을 수정 합 니 다 |

6332 단어
필요 한 배경:
디 렉 터 리 A 는 자동 화 된 패키지 생 성 apk 파일 을 저장 하 는 데 사 용 됩 니 다. 현재 패키지 이름 의 명명 규칙 을 개 발 했 습 니 다: 환경 이름 (pro | uat) - release - 날짜 - v 버 전 번호. apk
원래 생각 은 정규 표현 식 을 통 해 새로운 가방 이름 과 일치 하 는 것 이 었 으 나 셸 스 크 립 트 에서 정규 표현 식 을 사용 하 는 것 을 발 견 했 습 니 다. 저 는 현재 정규 표현 식 이 shel 스 크 립 트 에서 유효 하 다 는 것 을 어떻게 검증 하 는 지 잘 모 르 겠 습 니 다.
만능 검색엔진 을 통 해 또 다른 방법 을 찾 았 다. 더 간단 하고 직접적 이다.
지정 한 디 렉 터 리 에 있 는 apk 이름 을 직접 가 져 오고 고정된 이름 으로 이름 을 바 꾸 면 제 가 사용 하기에 편리 합 니 다 (python 스 크 립 트 를 통 해 apk 를 민들레 에 업로드 합 니 다)
 
원본 파일 이름:
pro-release-20191220-v2.0.8.apk
[root@67 release]# ls
output.json  pro-release-20191220-v2.0.8.apk  test.sh

스 크 립 트 구현:
apk 로 끝 나 는 파일 이름 을 new NameStr 로 변경 합 니 다.
for file in `ls | grep .apk`
do
 newfile='newNameStr'
 mv $file $newfile
done

스 크 립 트 실행 효과:
[root@67 release]# sh test.sh
[root@67 release]# ls
newNameStr output.json test.sh

 
내용 확장:
머리말
본 고 는 주로 리 눅 스 셸 이 sed 로 파일 이름 을 대량으로 변경 하 는 것 에 관 한 내용 을 소개 하고 참고 학습 을 제공 합 니 다. 다음은 더 이상 말 하지 않 겠 습 니 다. 상세 한 소 개 를 해 보 겠 습 니 다.
예시
특정 문자 제거
대상: 2017 - 01 - 01. jpg, 2018 - 01 - 01. jpg 를 20170101. jpg, 20180101. jpg 로 변경
방법: 모든 - 비 워 두 기
?
1
2
3
4
5 for file in ` ls | grep .jpg` do   newfile=` echo $ file | sed 's/-//g' `   mv $ file $newfile done
표준 출력 문자열 을 sed 로 바 꿉 니 다. 일반적인 형식 은 다음 과 같 습 니 다.
?
1 stdout | sed 's/pattern/replace/'
위 예제 에 서 는 첫 번 째 일치 항목 만 바 꾸 는 것 이 아니 라 마지막 에 g 를 추가 합 니 다.
중간 삽입 문자
대상: book 01. txt, paper 02. txt 를 book - 01. txt, paper - 02. txt 로 변경
방법: 삽입 할 위치 양쪽 에 있 는 문자열 을 그룹 으로 나 누 어 가 져 온 다음 역방향 참조 로 교체 합 니 다.
?
1
2
3
4
5 for file in ` ls | grep .txt` do   newfile=` echo $ file | sed 's/\([a-z]\+\)\([0-9]\+\)/\1-\2/' `   mv $ file $newfile done
분석 하 다.
위 예제 에 서 는 먼저 ls 와 grep 명령 을 통 해 이름 을 바 꿀 파일 목록 을 얻 은 다음 sed 명령 으로 문자열 을 바 꾸 고 마지막 으로 뮤 직 비디오 명령 을 사용 하여 파일 이름 변경 을 완성 합 니 다.
이름 을 바 꿀 파일 목록 을 가 져 오 는 방법 은 여러 가지 가 있 습 니 다. find 명령 을 통 해 문자열 을 직접 보 낼 수도 있 습 니 다. 다음 글 에서 언급 하 겠 습 니 다.
다음  ls | grep .txt 이 명령 은 두 개의 작은 따옴표 로 묶 었 다.  $(ls | grep .txt)  역할 이 같 습 니 다. 포 위 된 문자열 은 명령 으로 실 행 된 다음 문자열 결 과 를 되 돌려 줍 니 다.
파일 이름 에 빈 칸 을 포함 하 는 해결 방법
명령 을 통 해 얻 는 것 이 아니 라 파일 목록 을 for 순환 에 직접 쓸 수 있 습 니 다. 예 를 들 어:
?
1
2
3
4 for file in "file1 file2 file3" do   ... done
for 순환 은 빈 칸 을 통 해 문자열 을 분할 하 는 것 을 볼 수 있 습 니 다. 따라서 변경 할 파일 이름 에 빈 칸 이 포함 되 어 있 으 면 여러 파일 이름 으로 나 누 어 져 오류 가 발생 합 니 다.
이 문 제 를 해결 하려 면 IFS (내부 필드 구분자) 를 줄 바 꿈 문자 로 설정 할 수 있 습 니 다. 그러면 for 순환 은 줄 에 따라 변수의 값 을 가 져 와 서 매번 가 져 오 는 것 이 완전한 파일 이름 인지 확인 할 수 있 습 니 다.
IFS 변 수 를 설정 하 는 명령 은 for 순환 전에 두 어야 합 니 다.
?
1
2
3
4
5 IFS=$ '
'
for file in ` ls ` do   ... done
while read 명령 을 사용 하여 변수 file 에 한 줄 씩 읽 을 수도 있 습 니 다.
?
1
2
3
4 ls | grep "*.txt" | while read file do   ... done
find 로 파일 목록 가 져 오기
이전 예제 에서 우 리 는 ls 명령 을 통 해 파일 목록 을 가 져 왔 습 니 다.이 명령 은 디 렉 터 리 의 파일 만 가 져 올 수 있 고 여러 조건 으로 선별 할 수 없습니다.
파일 찾기 하면 기능 이 강 한 find 명령 을 언급 하지 않 을 수 없다.이 명령 은 여러 차원 의 디 렉 터 리 에서 파일 을 찾 을 수 있 으 며, 생 성 시간, 파일 크기, 소유자 등 다양한 조건 을 설정 하여 파일 을 찾 는 것 이 매우 편리 하고 유연 합 니 다.
find 명령 으로 파일 목록 을 가 져 오고 sed 명령 으로 정규 표현 식 에 맞 춰 파일 이름 을 수정 합 니 다. 이 두 명령 의 결합 은 거의 모든 일반적인 일괄 이름 변경 작업 을 수행 할 수 있 습 니 다.
예 를 들 어 1M 이상 이 고 txt 또는 jpg 로 접 두 사 를 붙 인 파일 은 book 과 같 습 니 다.20170101.txt、image_20170101. jpg 의 파일 이름 은 20170101 - book. txt, 20170101 - image. jpg 로 바 뀌 었 습 니 다. 코드 는 다음 과 같 습 니 다.
?
1
2
3
4
5 for file in ` find . -size +1M -name "*_*.txt" -o -name "*_*.jpg" ` do   newfile=` echo $ file | sed 's/\([a-z]\+\)_\([0-9]\+\)./\2-\1./' `   mv $ file $newfile done
find 명령 에 대한 더 많은 용법 은 참고 할 수 있 습 니 다. //www.jb51.net/article/108198.htm
 
참고 문서:
Linux 셸 은 sed 를 이용 하여 파일 이름 을 대량으로 변경 하 는 방법 에 대한 자세 한 설명

좋은 웹페이지 즐겨찾기