파일 이름의 시작과 끝에서 문자 패턴 제거

파일 이름의 시작과 끝에서 문자 패턴 제거

이름을 바꾸고 싶은 파일이 많이 있습니다. 파일 이름은 특정 형식을 따릅니다.

p1.uniquenameA#blah_a
p2.uniquenameB#blah_b
p3.uniquenameC#blah_c
p4.uniquenameD#blah_d
p5.uniquenameE#blah_e
p6.uniquenameF#blah_f
p7.uniquenameG#blah_g
p8.uniquenameH#blah_h
p9.uniquenameI#blah_i
p10.uniquenameJ#blah_j

각각의 고유한 파일 이름 앞에는 접두사가 붙습니다. 이 경우 접두사는 문자로 시작 하고 그 뒤에 1씩 증가하는 p숫자가 옵니다 . p마침표( .)는 접두어와 고유 파일 이름을 구분합니다. 각 고유 파일 이름 뒤에는 해시태그( )로 #시작하는 접미사가 옵니다. 마침표(마침표 포함)로 시작하는 접두사를 제거하고, 해시태그(해시태그 포함)로 시작하는 접미사도 제거하고 싶습니다. 생성된 파일 이름이 다음과 같이 마침표와 해시 태그 사이의 고유한 파일 이름이기를 원합니다.

uniquenameA
uniquenameB
uniquenameC
uniquenameD
uniquenameE
uniquenameF
uniquenameG
uniquenameH
uniquenameI
uniquenameJ

저는 스크립팅이 처음이므로 코드를 제공하는 것 외에 코드가 어떻게 작동하는지 설명해 주시면 감사하겠습니다.

답변1

perl버전 rename(때때로 라고도 함 )이 있는 경우 prename정규식 대체를 적용할 수 있습니다.

rename -n 's/^.*?\.(.*?)#.*/$1/' *

정규식(RE)을 모른다면 배울 가치가 있습니다.

  • s/xx/yy/- 사용. . . 교체xxyy
  • ^- 줄의 암시적 시작과 일치합니다.
  • .*?- 가능한 가장 짧은 문자열과 일치0개 이상의 문자나머지 패턴 일치가 적용됩니다.
  • \.- 텍스트 포인트 일치 .( .문자는아무것, 그러나 \.문자 그대로의 요점입니다)
  • (... )대괄호 안의 패턴과 일치하고 나중에 인용되는 일치 번호 1..9를 할당합니다 $1(두 번째 (... 는 등이 )됩니다 $2).
  • #- 텍스트 문자
  • .*- 가장 긴 게임은0개 이상의 문자( .이것은아무것*이전 항목은 _zero 이상을 의미함 )

-n만족스러우면 삭제하세요('조치 없음').회의일하다. -v실제로 어떤 일이 일어나는지 보려면 교체하거나 자동 작동을 위해 무시하세요.

답변2

awk작업을 수행하는 스크립트 는 다음과 같습니다 .

인쇄/디버깅에만 해당:

awk 'match($0,/(^[^\\.]+.)([^#]+)/,m){print "mv "$0" "m[2] }' input.txt    

이름을 바꾸려면:

awk 'match($0,/(^[^\\.]+.)([^#]+)/,m){system("mv "$0" "m[2])}' input.txt    

입력.txt

p1.uniquenameA#blah_a
p2.uniquenameB#blah_b
p3.uniquenameC#blah_c
p4.uniquenameD#blah_d
p5.uniquenameE#blah_e
p6.uniquenameF#blah_f
p7.uniquenameG#blah_g
p8.uniquenameH#blah_h
p9.uniquenameI#blah_i
p10.uniquenameJ#blah_j

산출

mv p1.uniquenameA#blah_a uniquenameA
mv p2.uniquenameB#blah_b uniquenameB
mv p3.uniquenameC#blah_c uniquenameC
mv p4.uniquenameD#blah_d uniquenameD
mv p5.uniquenameE#blah_e uniquenameE
mv p6.uniquenameF#blah_f uniquenameF
mv p7.uniquenameG#blah_g uniquenameG
mv p8.uniquenameH#blah_h uniquenameH
mv p9.uniquenameI#blah_i uniquenameI
mv p10.uniquenameJ#blah_j uniquenameJ

답변3

다음은 다음을 사용하는 솔루션입니다.sed

for i in *
do
    mv $i $( echo $i | sed 's/p[[:digit:]]*\.\([^#]*\)\#.*/\1/' )
done

대상은 숫자 뒤에 마침표가 오는 sed것을 찾아서 생성됩니다. p이 기간의 시작부터 이 역할의 역할은 #다음과 같습니다.기억하다레지스터에 들어가면 전체 파일 이름이 다음으로 대체됩니다.기억하다수치.

관련 정보