Perl의 rename(1)과 유사하지만 파일 복사용 스크립트인가요?

Perl의 rename(1)과 유사하지만 파일 복사용 스크립트인가요?

그래서 이런게 있어요rename(1)진주물건. 그것은 내 작업에 완벽하게 맞습니다. 단지 기본적 cp으로 mv.

이 목표를 달성하는 방법은 무엇입니까? 나는 꽤 많은 이름 바꾸기 규칙을 가지고 있으며 모두 s|/foodir/|/|;s|/bardir/|/|압축된 형식으로 표현되어 있고 복사해야 할 몇 줄의 파일 패턴이 있습니다.

다음과 같이 보입니다.

rename -v 's|/pars/|/|; s|/fts/|/|; s|innobase/include|include|' \
    storage/{innobase,xtradb}/pars/{pars0grm.cc,pars0grm.y,pars0lex.l,lexyy.cc} \
    storage/{innobase,xtradb}/fts/{fts0blex.cc,fts0blex.l,fts0pars.cc,fts0pars.y,fts0tlex.cc,fts0tlex.l} \
    storage/innobase/include/fts0[bt]lex.h

답변1

이건 직업이야공원. pax표준 POSIX 명령입니다. 일부 Linux 배포판에서는 기본 설치에서 이를 생략하므로 패키지를 명시적으로 설치해야 할 수도 있습니다. 기본 sed 정규식 대체만으로 Perl의 모든 기능을 사용할 수는 없지만 사용 사례에는 충분합니다.

pax -rw -pe -s'|/pars/|/|' -s'|/fts/|/|' -s'|innobase/include|include|' …

더 강력한 것을 원한다면 여기 있습니다다루기 힘든zmv.이 웹 사이트에는 많은 예가 있습니다.,예를 들어파일 이름 탐색, 복사 및 변환,복사할 때 파일 이름을 바꾸는 방법은 무엇입니까?

답변2

당신처럼 나도 다른 도구나 구문이 필요하지 않습니다 copy. rename나는 이 질문에 방금 대답했습니다!cp에 정규식 사용하기. 귀하의 편의를 위해 여기에 게시됩니다.

rename저는 Perl 스크립트 (Robin Barker 및 Larry Wall 작성) 의 정규식 구문을 정말 좋아합니다 . 예를 들면 다음과 같습니다.

rename "s/OldFile/NewFile/" OldFile*

OldFile.c각각 및 OldFile.h로 이름이 변경 되었습니다.NewFile.cNewFile.h

복사 명령을 사용하여 똑같은 결과를 얻고 싶습니다.

copy "s/OldFile/NewFile/" OldFile*

그래서 스크립트를 복사하고 rename 문을 copy via로 변경했습니다 File::Copy. 기다려 보세요! Perl-regex 구문을 사용하여 명령 복사: 제시 워드/워피

답변3

sed좋아, 그래서 나는 이렇게 평범하고 오래된 것들 로부터 벗어날 수 있었습니다 .

ls -1 \
    storage/{innobase,xtradb}/pars/{pars0grm.cc,pars0grm.y,pars0lex.l,lexyy.cc} \
    storage/{innobase,xtradb}/fts/{fts0blex.cc,fts0blex.l,fts0pars.cc,fts0pars.y,fts0tlex.cc,fts0tlex.l} \
    storage/innobase/include/fts0[bt]lex.h \
    | sed -re 'h; s|/pars/|/|; s|/fts/|/|; s|innobase/include|include|; H; x; s|\n| |' \
    | xargs -L1 cp -v \
    ;

스크립트 sed는 그다지 간단하지 않으므로 (나중에를 위해) 단계별로 설명하겠습니다.

  • h현재 라인("패턴 공간")을 레지스터("홀딩 공간")에 복사합니다.
  • 매번 평소와 같이 패턴 공간을 편집하고 s공간을 변경하지 않고 유지합니다.
  • H 추가이제 라인을 Holding Register로 편집하십시오 - 결국 보류하십시오.줄, 이전 파일 이름과 새 파일 이름, \n물론 포함된 문자;
  • x 말하다패턴 공간이 있는 보유 공간, 보유 레지스터에서 이전 쌍과 새 쌍을 효과적으로 로드합니다.
  • s|\n| |두 줄을 한 줄로 병합하고 공백으로 구분합니다.
  • p마지막으로 결과는 암시적으로 ( sed호출 없이 ) 인쇄됩니다 -n.

요약하면 파이프라인은 다음과 같이 작동합니다.

  • ls -1모든 glob을 실제 기존 파일의 파일 이름으로 확장하고 한 줄에 하나씩 인쇄합니다.
  • sed"$old_filename $new_filename"다시 한 줄에 하나의 파일 로 변경하십시오 .
  • xargs -L1cp -v $old_filename $new_filename모든 회선에 통화가 있습니다.

그게 다야!

관련 정보