배치 파일 이름에서 특정 숫자 제거

배치 파일 이름에서 특정 숫자 제거

이름에 21부터 29까지의 숫자가 포함된 파일 배치가 있습니다. 수백 개의 파일을 수동으로 삭제하고 싶지 않기 때문에 터미널을 사용해 보았습니다.

for f in *; 
do for x in {21..29};
rename=`echo "$f" | sed 's/\$x//'`
mv "$f" "$rename"; done;

그러나 아무 일도 일어나지 않았습니다. 일부 파일이 포함된 테스트 폴더에서 재미삼아 "$x"를 문자 "a"로 바꾸면 첫 번째 문자 "a"가 실제로 제거되지만 숫자에는 작동하지 않습니다. 내가 뭘 잘못했나요?

어떤 도움이라도 정말 감사하겠습니다! 감사합니다!

답변1

작은따옴표 안에 있으면 명령이 확장되지 않으므로 명령 sed이 작동하지 않습니다 . $x그러나 실제로는 작업에 잘못된 도구를 사용하고 있습니다.

셸을 사용할 수 있는 경우 해당 셸로 전환하여 기여된 모듈과 내장된 숫자 글로브 범위를 zsh활용하는 것이 좋습니다 .zmv<m-n>

전임자. 주어진

 % ls -d -- *.mp4
'video snap 02 car 23 December.mp4'  'video snap car 23 December.mp4'

그 다음에

 % autoload -Uz zmv

 % zmv -n '(*) <21-29> (*.mp4)' '$1 $2'
mv -- 'video snap 02 car 23 December.mp4' 'video snap 02 car December.mp4'
mv -- 'video snap car 23 December.mp4' 'video snap car December.mp4'

-n교체가 제대로 작동한다고 생각되면 삭제하세요(조치 없음).


zsh를 사용할 수 없는 경우 숫자 범위를 간단한 쉘 패턴으로 표현할 수 있으므로 bash에서 다음을 수행할 수 있습니다.

$ for f in *2[123456789]*.mp4; do echo mv -n -- "$f" "${f/ 2[123456789]}"; done 
mv -n -- video snap 02 car 23 December.mp4 video snap 02 car December.mp4
mv -n -- video snap car 23 December.mp4 video snap car December.mp4

이 경우 echo실제로 이름을 바꾼 파일을 삭제하십시오( -n이름 충돌이 덮어쓰이는 것을 방지하므로 보관하십시오).

답변2

for f in *;
do echo "$f" | awk '{gsub("[0-9]{2,}", "", $0); print}'  |xargs -I {} mv "$f" {}
done

이 코드는 모든 파일을 반복하여 이름을 파이프로 연결합니다., awk는 두 자리 이상의 숫자를 대체하고 다음으로 파이프합니다.MV명령(이름 바꾸기용).

매개변수표준 입력을 올바른 인수 위치에 전달하는 데 사용됩니다.

편집: filename에 대한 새 정보를 제공했으므로 video snap 02 car 23 December.mp4이 코드는 이름의 마지막에서 두 번째 필드에 있는 숫자만 제거해야 합니다.

for f in *;
do echo "$f" | awk '{gsub("[0-9]", "", $(NF-1)); print}'  |sed 's/  / /g'  |xargs -I {} mv "$f" {} ;
done

관련 정보