그래서 이런게 있어요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.c
NewFile.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 -L1
cp -v $old_filename $new_filename
모든 회선에 통화가 있습니다.
그게 다야!