수천 개의 파일 이름
t_00xx_000xxx.png
이 로 00xx_000xxx.png
시작하는 파일의 이름을 변경하고 싶습니다 t_
.t_00xx_000xxx.png
00xx_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