파일 이름에서 개행 문자를 반복적으로 제거합니다.

파일 이름에서 개행 문자를 반복적으로 제거합니다.

제목에서 알 수 있듯이 디렉터리와 모든 하위 디렉터리를 검색하고 파일 이름에서 모든 줄 바꿈을 제거하고 싶습니다.

여기에 제안된 현재 솔루션은 작동하지 않습니다.파일 이름에서 개행 문자 제거

이것은 다음을 사용할 때 얻는 결과입니다.

$ 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중 하나를 사용해야 합니다 .prenameutil-linuxrename.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및 매개변수가 필요하므로 오류 메시지가 표시됩니다 .tonot enough arguments

SYNOPSIS
       rename [options] expression replacement file...

따라서 이 경우에는 다음이 필요합니다.

find . -name $'*\n*' -exec rename $'\n' ' ' {} \;

또한보십시오:

간단한 사용량 비교 수행

관련 정보