이름에 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