find ....-execdir이 누락된 파일의 이름을 바꾸는 이유는 무엇입니까? 다루기 힘든

find ....-execdir이 누락된 파일의 이름을 바꾸는 이유는 무엇입니까? 다루기 힘든

MX Linux 23.2에서 zsh를 사용하고 있습니다.

수년 동안 나는 왜 다음과 같은 명령이 나오는지 알아내려고 노력해 왔습니다.

find . -depth -type f -execdir rename 's/_720p//' {} \;

파일을 건너뜁니다.

내 파일 관리자가 변경 사항을 표시하지 않는다는 것을 알았으므로 ls터미널에 입력하여 확인했습니다. 바라보다! 이름에 "_720p"가 있는 파일이 여기에 나열됩니다.

프로세스를 백그라운드로 보내고 를 사용해 보았지만 wait동일한 결과를 얻었습니다. 내가 찾은 유일한 것은 다음과 같습니다.

while  [ ! .(NF) ]; do
filename=$(find . -type f -print0 -quit)
rename 's/_720p//' $filename
mv $filename $HOME/Videos
done

나는 이것과 원격으로 비슷한 다른 질문을 본 적이 없습니다. Linux 세계에서 이 일을 할 수 없는 사람은 나뿐인가요? 문제가 무엇입니까?

답변1

s/_720p//첫 번째 항목만 대체되므로 파일 이름 _720p이 .foo_720p_bar_720pfoo_bar_720p

g다음 항목을 모두 대체하려면 플래그를 추가해야 s/_720p//g하지만, 그래도 example이라는 파일에는 foo_72_720p0p항목이 하나만 있지만 _720p해당 항목이 제거되면 이름이 변경됩니다.foo_720p

이 경우 while (s/_720p//g) {}아무것도 발견되지 않을 때까지 교체를 다시 시도해야 합니다.

또한 일부 Perl 기반 rename구현에서는 -d파일의 기본 이름에서만 작동하도록 선택할 수 있으므로 rename각 파일에 대해 하나씩 실행할 필요가 없습니다.

find . -depth -name '*_720p*' -type f -exec rename -d '
  while (s/_720p//g) {}' {} +

zsh대량 이름 바꾸기는 자동 로드 기능에 내장되어 있습니다 zmv.

autoload -Uz zmv
zmv '(**/)(*_720p*)(#q.)' '$1$2:gs/_720p//'

모든 항목이 대체됩니다. 케이스 처리 _72_72_720p0p0p:

zmv '(**/)(*_720p*)(#q.)' '$1$2:fs/_720p//'

f다음과 같은 상황을 일으키는 모든 것s 수정자수정 사항이 없을 때까지 반복합니다.


1 그러나 보안 개선의 혜택을 받지는 않습니다 -execdir. 일부 find구현에서는 이를 지원 {} +하지만 -execdir여전히 디렉토리당 적어도 하나를 실행해야 합니다 rename.

관련 정보