답변:
다른 사람들이 언급했듯이 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
rename
기능 이 없을 때 유용 합니다 (예 : busybox)
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
약간의 쉘 코딩 재미를 위해. (-:
sed
예는 꽤 좋습니다.
배관공이기 때문에 나는 파이프를 좋아한다 :)
참고 :이 답변은 장황합니다-초보자로서 알고있는 사람이 설명하는 데 시간이 걸리므로 감사합니다. '앞으로'지불하고 있습니다. 당신이 초보자가 아닌 경우, 길이와 자세한 설명을 해주십시오.
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은 첫 번째 캡처 그룹을 나타냅니다.
보안 경고 : 결과를 완전히 이해하지 않으면 파이프를 강타하지 마십시오.
그것이 막힘을 없애는 데 도움이되기를 바랍니다 :)