일부 파일 이름 변경(접두사에서 접미사로)

일부 파일 이름 변경(접두사에서 접미사로)

수천 개의 파일 이름 t_00xx_000xxx.png이 로 00xx_000xxx.png시작하는 파일의 이름을 변경하고 싶습니다 t_.t_00xx_000xxx.png00xx_000xxx_t.png

따라서 일부 파일에서는 접두사가 접미사로 사용됩니다. 단 하나의 명령으로 이 작업을 수행할 수 있습니까?

저는 SUSE SLES12 SP2를 실행하고 있습니다.

답변1

x가 임의의 단일 문자일 수 있는 파일 이름 패턴이 주어지면 t_00xx_000xxx.png다음 루프는 ?와일드카드를 사용하여 변수 문자를 대체합니다. 이 루프는 t_.로 시작하고 끝나는 파일 만 선택합니다 .png. 매개변수 확장을 사용하여 선행 부분을 제거한 다음 필요한 하위 문자열을 추출하여 원하는 위치로 t_이동합니다 ._t

for f in t_00??_000???.png
do
  echo mv -- "$f" "${f:2:11}_t.png"
done

일부 가상 파일 이름의 경우 샘플 출력은 다음과 같습니다.

mv t_0011_000111.png 0011_000111_t.png
mv t_0012_000345.png 0012_000345_t.png
mv t_00xx_000xxx.png 00xx_000xxx_t.png

echo결과가 올바르면 섹션을 삭제하세요.

답변2

문법적으로 sh:

for f in t_*.*; do
  dest=${f#t_}
  dest=${dest%.*}_t.${dest##*.}
  echo mv -i -- "$f" "$dest"
done

답변3

만약에SuSE SLES12에는 mcp/mmv 명령이 있습니다.저장소에서 다음을 간단히 사용할 수 있습니다 mmv.

mmv 't_*.png' '#1_t.png'

또는 문자 수와 특정 숫자에 문제가 있는 경우 다음과 같이 더 구체적으로 지정할 수 있습니다.

mmv 't_00??_000???.png' '00#1#2_000#3#4#5_t.png'

첫 번째 인수밀리미터파는 표준 와일드카드를 사용하는 소스 *이고 ?두 번째 매개변수는 대상입니다.#1첫 번째 와일드카드 일치로 대체되었습니다.#2두 번째 와일드카드와 일치하는 항목 등

예:

% ls -1
t_0011_000037.png
t_0011_000038.png
t_0011_000039.png
t_0022_000001.png
t_0022_000002.png

% mmv 't_*.png' '#1_t.png'

% ls -1
0011_000037_t.png
0011_000038_t.png
0011_000039_t.png
0022_000001_t.png
0022_000002_t.png

답변4

첫 번째 밑줄 이전의 모든 것이 접두사라고 가정하면 작동합니다.

for f in *.png; do
    new=$(echo "$f" | sed -r 's/^([^_]*)_(.*)\.(.*)$/\2_\1.\3/');
    echo "Renaming: $f => $new";
    #mv $f $new
done

출력이 만족스러우면 #이전 출력을 삭제하세요.mv


다음을 사용하면 더 쉬울 것입니다 prename.

prename -n 's/^([^_]*)_(.*)\.(.*)$/$2_$1.$3/'

t_항상 접두사인 경우 다음 패턴으로 변경합니다.

for f in t_*.png; do
    new=$(echo "$f" | sed -r 's/^t_(.*)\.(.*)$/\1_t.\2/');
    echo "Renaming: $f => $new";
    #mv $f $new
done

관련 정보