mv와 같은 리눅스 명령이 있지만 정규식이 있습니까?


답변:


32

다른 사람들이 언급했듯이 rename이것에 능숙하지만 man rename시도하기 전에 맨 페이지 ( )를 읽으 십시오. 최소한 두 가지 완전히 다른 도구가 있으며 rename배포판에 따라 다른 도구가 있습니다 . 잘못 호출하면 위험 할 수 있습니다.

Ubuntu와 함께 제공되는 Larry Wall의 perl 기반 버전에 대한 매뉴얼 페이지다음과 같습니다 . 당신은 그것을 같은 펄 표현을 제공rename 's/\.sql$/.php/' *.sql

이전 Red Hat 및 CentOS 배포판과 함께 제공되는 이름 바꾸기 매뉴얼 페이지다음과 같습니다 . 사용법은 다음과 같은 간단한 문자열 대체입니다.rename .sql .php *.sql

bash one-liner를 사용하여 각 파일을 한 번에 하나씩 처리 할 수도 있습니다.

$ for f in *.sql; do mv -i "$f" "${f%%.*}.php"; done

누군가 perl 기반 이름 바꾸기를 위해 Windows 바이너리를 업로드 할 수 있습니까?
mcandre

Perl 버전 이름 변경은 파일을 한 파일 시스템에서 다른 파일 시스템으로 이동할 수 없습니다.
lilydjwg

bash one-liner는 특히 rename기능 이 없을 때 유용 합니다 (예 : busybox)
artm

10

거기에 rename(1)정규 표현식에 사용하지 않고, 문제를 해결할 수있는 :

rename .sql .php *.sql

또한 mmv(1)있지만 작동 방식에 익숙하지 않습니다.


우분투와 데비안에서는 (다른 배포판에 대해서는 잘 모르겠습니다) 기본적으로 /usr/bin/rename연결 /usr/bin/prename되며 정규 표현식이 필요합니다.
ℝaphink

5

G'day,

당신은 또한 입력을 시도 할 수 있습니다

for i in $(\ls -d *.sql)
do
mv $i $(echo $i | sed -e 's/\.sql$/\.php/')
done

또는 정규식을 사용하도록 약간 변경하십시오.

for i in $(\ls -d | egrep -e '.*\.sql')
do
mv $i $(echo $i | sed -e 's/\.sql$/\.php/')
done

약간의 쉘 코딩 재미를 위해. (-:


2
이름에 공백이 포함 된 파일에서는 실패하므로주의하십시오. 출력을 구문 분석ls 해서는 안됩니다 .
slhck

그러나이 sed예는 꽤 좋습니다.
bright-star

2

배관공이기 때문에 나는 파이프를 좋아한다 :)

참고 :이 답변은 장황합니다-초보자로서 알고있는 사람이 설명하는 데 시간이 걸리므로 감사합니다. '앞으로'지불하고 있습니다. 당신이 초보자가 아닌 경우, 길이와 자세한 설명을 해주십시오.

ls -1 *_201[67][0-9]* | sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/' | bash

어디:

ls -1 *_201[67][0-9]*

패턴과 일치하는 모든 파일을 나열합니다.이 경우 파일 이름에서 날짜가 'YYYYMMDD'인 파일을 찾습니다.

sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/'
#        : | |    |     |                  | |       |                    |:                                 :
#        : |^2....^    ^3..................^^4.......^                    |:                                 :
#        :^1..............................................................^:                                 :
#        /................filename.................pattern................./...mkdir...and....mv...command.../

^ 1 : 첫 번째 캡처 그룹-전체 파일 이름

^ 2 : 두 번째 캡처 그룹-파일 이름 패턴의 첫 번째 부분

^ 3 : 세 번째 캡처 그룹-두 번째 파일 이름 부분-여기에서 날짜는 'YYYYMMDD'

^ 4 : 4 번째 캡처 그룹-날짜와 확장자 사이의 선택적 파일 이름 부분과 확장자 자체

Sooooo ....라는 파일이 있으면

CallLog_555123412_20161231-214403.7z

...그때

mkdir -p \2\/\3; mv \1 \2\/\3\/\1

실제로 의미

# make directory and sub-directory
mkdir -p CallLog_555123412/20161231
# move file from current directory to sub-sub-directory just created
mv CallLog_555123412_20161231-214403.7z CallLog_555123412/20161231/CallLog_555123412_20161231-214403.7z

sed 명령의 출력은 'bash'로 파이프되어 실행됩니다. 실제로 파일을 이동하지 않고 제안 된 파일이 이동 한 것을 보려면 먼저 '| 마지막에 bash '하고 다음과 같이 시도하십시오.

ls -1 *_201[67][0-9]* | sed -e 's/\(\(.\+\)[-_]\(201[67][0-9]\{4\}\)\([^.]\+\)\?\.[0-9a-z]\{2,3\}\)/mkdir -p \2\/\3; mv \1 \2\/\3\/\1/'

이것은 전혀 변경되지는 않지만 '|로 실행하면 실행될 명령이 표시됩니다. bash '는 끝에 태그되었습니다.

이것은 파일 이름의 일부 또는 sed 명령의 '대체'텍스트에 추가하는 다른 하위 디렉토리를 만들 수 있기 때문에 유용합니다. 그러나 sed에는 많은 이스케이프 문자가 필요합니다.

SED 정규식 브래킷 :

(...) 캡처 그룹화를 위해 이스케이프 처리 필요-> \ (... \)

{m, n}은 이전 객체를 정량화하기 위해 이스케이프해야합니다-> \ {m, n \}

/는 대체 문자열에서 이스케이프해야합니다-> \ /

[...] 문자 클래스를 이스케이프 처리하지 않아도됩니다.

대체 문자열의 \ 1은 첫 번째 캡처 그룹을 나타냅니다.

보안 경고 : 결과를 완전히 이해하지 않으면 파이프를 강타하지 마십시오.

그것이 막힘을 없애는 데 도움이되기를 바랍니다 :)


1

설치 mmv후 다음을 수행하십시오.

mmv "*.sql" "#1.php"
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.