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_720p
foo_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
.