제목에서 알 수 있듯이 디렉터리와 모든 하위 디렉터리를 검색하고 파일 이름에서 모든 줄 바꿈을 제거하고 싶습니다.
여기에 제안된 현재 솔루션은 작동하지 않습니다.파일 이름에서 개행 문자 제거
이것은 다음을 사용할 때 얻는 결과입니다.
$ find -name $'*\n*' -exec rename $'s|\n| |g' '{}' \;
rename: not enough arguments
Try 'rename --help' for more information.
내가 추가하면*
$ find -name $'*\n*' -exec rename $'s|\n| |g' '{}' * \;
오류 메시지는 생성되지 않지만(명령만 수락함) 하위 디렉터리의 파일 이름은 바뀌지 않습니다.
답변1
의 변형 (때때로 호출됨) 대신 perl
에 기반 변형 (때때로 호출됨 ) rename
중 하나를 사용해야 합니다 .prename
util-linux
rename.ul
from은 util-linux
훨씬 더 제한적이며(훨씬 더 새롭기는 하지만), 다른 구문을 사용하고, 고정 문자열만 바꿀 수 있으며, 문자열의 모든 항목을 바꿀 수는 없습니다.
rename
여기서는 파일 이름의 개행만 변환되고 개행을 유발하는 디렉터리 구성 요소는 변환되지 않고 -depth
분기 전의 리프를 처리하는 데 사용되는 Perl 변형을 사용하겠습니다 .
perl
개행 문자로 인식되므로 코드 인수를 \n
사용할 필요가 없습니다 $'...'
(물론 제가 처음에 생각했던 것과 반대로 해도 괜찮습니다).
find . -depth -name $'*\n*' -exec rename '
s{[^/]*\z}{$& =~ y/\n/ /r}e' '{}' +
또는 사용 가능한 경우 사용하십시오(이렇게 하면 -execdir
파일이 있는 모든 디렉터리에서 적어도 하나가 실행되지만).rename
\n
find . -depth -name $'*\n*' -execdir rename 'y/\n/ /' {} +
zsh
또는 다음을 사용할 수 있습니다 zmv
.
autoload zmv
NL=$'\n'
zmv "(**/)(*$NL*)(#qD)" '$1${2//$NL/ }'
( find
- 기반 접근 방식과 달리 파일 이름에 유효한 문자를 형성하지 않는 일련의 바이트가 포함되어 있어도 계속 작동합니다. 또한 충돌이 감지되면 아무 작업도 하지 않고 종료됩니다.)
답변2
rename
제공된 명령은 util-linux
연결된 답변에 제공된 명령과 사용법이 다릅니다. 특히 단일 sed 스타일 대체 명령이 아닌 별도의 from
및 매개변수가 필요하므로 오류 메시지가 표시됩니다 .to
not enough arguments
SYNOPSIS
rename [options] expression replacement file...
따라서 이 경우에는 다음이 필요합니다.
find . -name $'*\n*' -exec rename $'\n' ' ' {} \;
또한보십시오:
- Debian/Ubuntu의 이름 바꾸기 유틸리티가 CentOS와 같은 다른 배포판의 이름 바꾸기 유틸리티와 다른 이유는 무엇입니까?
- 이름 바꾸기, 이름 바꾸기, 파일 이름 바꾸기 등 모든 이름 바꾸기 작업은 어떻게 되나요?
간단한 사용량 비교 수행