정규 표현식으로 리눅스에서 파일 이름 바꾸기


9

일관되게 이름을 바꾸고 싶은 파일 그룹이 있었고 파일 이름은 다음과 같습니다.

"System-Log-01-01-2009-NODATA.txt"
"Something-Log-01-01-2009-NODATA.txt"

그리고 나는 그것들을 소문자, yyyymmdd, .log 확장자로 원했습니다.

"system.20090101.log"
"something.20090101.log"

답변:


14

rename 명령을 발견 할 때까지 펄 스크립트를 작성했습니다.

이름을 변경하기 위해 perl 정규식을 허용합니다.

이를 위해 두 가지 명령을 입력했습니다.

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *
rename 'y/A-Z/a-z/' *.log

하지만 일부 배포판의 경우, rename(그 매뉴얼 페이지를 참조하십시오)이 기능을 가지고 있지 않으며, 당신은 설치해야 할 수 있습니다 perl-rename또는 prename.


아주 좋은 답변
Judioo

8
일부 배포판은 쓸모없는 이름 바꾸기 명령을 제공합니다. 먼저 배포판을 확인하십시오.
derobert

나는 알았지 mmv만 결국 덕분 rename에 정규 표현식의 힘을 사용할 수 있습니다
Ludovic Kuty

5
아치 리눅스에서 이것은입니다 perl-rename.
Oleh Prypin

6

이름 바꾸기 명령이 없기 때문에 이것에 의존하고 있습니다.

for myfile in /my/folder/*; do
    target=$(echo $myfile|sed -e 's/foo/bar/g')
    mv "$myfile" "$target"
done


5

renameutil은 "표준"이 아닙니다. 각 배포판은 다른 rename도구 와 함께 제공됩니다 . 예를 들어, 여기 Gentoo에서는 패키지 rename에서 sys-apps/util-linux왔으며 정규 표현식을 지원하지 않습니다.

Hamish Downermmv특히 스크립트 내에서 사용하기에 유용하다고 생각합니다.

반면에 일반적인 경우에는 renameutils를 원할 수 있습니다 . 그것은 당신이 선택한 텍스트 편집기 (내 환경 설정 : Vim)를 열고 거기에서 대상 파일 이름을 편집 할 수있는 명령 qmvqcp명령을 가지고 있습니다. 편집기를 저장하고 닫은 후 qmv/ qcp는 모든 이름 변경을 수행합니다.

모두 mmvqmv원형 이름 변경을 감지하는 것이 올바른 순서로 파일의 이름을 변경하는 스마트 충분하고 필요한 경우 자동으로 임시 파일을 만들 것입니다.


젠투에서는 sys-apps/rename패키지 를 사용할 수 있습니다.이 패키지 renamexm는 정규식 이름 바꾸기뿐만 아니라 대량 대문자 / 소문자 및 기타 좋은 것들을 제공합니다.
radicand

1

공정하게 :

rename 's/(\w+)-(\w+)-(\d\d)-(\d{4})-NODATA.txt\$1.$4$3$2.log$//' *.txt

이 출력을 제공합니다.

Use of uninitialized value $4 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $3 in regexp compilation at (eval 1) line 1.
Use of uninitialized value $2 in regexp compilation at (eval 1) line 1.

그러나:

rename -n 's/(\w+)-\w+-(\d{2})-(\d{2})-(\d{4})-NODATA\.txt$/$1.$4$3$2\.log/' *.txt && rename 'y/A-Z/a-z/' System.20090101.log

올바른 출력을 제공합니다.

System-Log-01-01-2009-NODATA.txt renamed as System.20090101.log
System.20090101.log renamed as system.20090101.log

{-n} 스위치를 {-v}로 교체


1

이를 위해 작은 bash 스크립트를 만들었습니다.

#!/bin/bash

for f in `ls /path/to/folder`; do
  # Create new filename from the old one
  # This example replaces A (upper case) with a (lower case)
  new_file=`echo "$new_file" | tr A a`

  # Rename the file
  mv "$f" "$new_file"
done

일반적으로 구문 분석 ls출력은 최상의 아이디어가 아닙니다. 무작위 검색이 유닉스 에서이 긴 글을 읽었습니다 . 당신의 즐거움을 위해 SE . | 또한 귀하의 답변은 tr '[:upper:]' '[:lower:]'
HBruijn
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.