디렉토리 이름에서 캐리지 리턴을 제거하는 방법은 무엇입니까?

디렉토리 이름에서 캐리지 리턴을 제거하는 방법은 무엇입니까?

Excel에서 파일을 만들고 해당 파일을 Linux 컴퓨터로 ftp로 보냈습니다. 파일에는 많은 명령이 있습니다 mkdir. 새로 생성된 모든 디렉토리에는 이제 끝에 캐리지 리턴 문자가 있습니다. 다음을 사용하여 디렉토리를 찾을 수 있습니다.

find . -type d -name *$'\r'

하지만 다음 명령을 사용하여 삭제하려고 하면 다음과 같습니다.

find . -type d -name *$'\r' | xargs rm-rf

작동하지 않습니다. 아무것도 삭제되지 않습니다. 디렉토리는 여전히 존재하며 여전히 캐리지 리턴이 있습니다.

불쾌한 "\r"을 제거하는 명령을 만드는 것을 도와주실 수 있나요? 감사해요.

추신: 저는 RHEL 5.3을 사용하고 있습니다.

답변1

리눅스rename이 명령을 사용하면 이 작업이 쉬워집니다.

rename $'\r' '' *

$'\r'현재 디렉터리의 모든 파일 이름에서 첫 번째이자 유일한 캐리지 리턴 문자( )를 빈 문자열( )로 바꿉니다 . 캐리지 리턴이 포함되지 않은 이름은 변경되지 않습니다. 또는 이름을 바꿔야 하는 것으로 간주되는 파일만 ''쓸 수 있습니다 .rename $'\r' '' *$'\r'

하위 디렉터리의 파일에도 작업이 필요한 경우:

shopt -s globstar
rename $'\r' '' **/*$'\r'

(Debian, Ubuntu 및 그 파생 제품 사용자: rename로 변경 rename.ul하거나 rename $'\r' ''로 변경합니다 rename 's/\r//'.)

대안으로 zsh를 사용하세요zmv기능:

zmv $'**/*\r' "${f%?}"

답변2

편집: sed줄에서 \r을 두 번 이스케이프하는 것을 잊었습니다.

그 중 하나가 당신에게 적합합니다

for i in $(find . -type d -name '*\r'); do mv "$i" "$(echo $i | sed -e 's/\\r//g')"; done

find . -type d -name '*\r' -exec mv "{}" "$(echo {} | sed -e 's/\\r//g')" \;

현재 디렉토리 아래에서 *$\r이라는 이름의 모든 디렉토리를 찾습니다.

그런 다음 mv\r을 뺀 동일한 이름으로 이름을 바꿉니다.

답변3

이 시도find . -type d -name *$'\r' -exec rm -rf '{}' \;

관련 정보