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

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

이름을 바꾸고 싶은 파일이 많이 있습니다. 해당 파일 이름은 특정 형식으로 되어 있습니다.

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/- xx로 교체yy
  • ^- 암시적인 줄 시작과 일치합니다.
  • .*?- 가능한 한 짧은 문자열과 일치0개 이상의 문자나머지 패턴 일치에 따라
  • \.- 문자 그대로의 점과 일치합니다 .(. 문자는아무것, 그러나 \.문자 그대로의 점입니다)
  • (... )대괄호 안의 패턴을 일치시키고 일치 번호 1..9를 할당합니다. 나중에 참조됩니다 $1(두 번째는 (... 등이 )될 것입니다 $2).
  • #- 문자 그대로의 문자
  • .*- 가장 긴 경기0개 이상의 문자(그만큼. 이다아무것*이전 항목 중 0개 이상을 의미함 )

제거-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이후부터 현재까지의 등장인물# 생성됩니다. 해당 기간부터 해당 캐릭터기억하다레지스터에 저장되고 전체 파일 이름은 다음으로 대체됩니다.기억하다문자.

관련 정보