Linux 서버에서 파일 이름에 줄바꿈이 포함된 파일 전송

Linux 서버에서 파일 이름에 줄바꿈이 포함된 파일 전송

내 서버의 일부 파일에 실수로 개행 문자가 저장되었습니다. file?name.txt서버에서 파일을 볼 때 나타납니다 . scp를 사용하여 이러한 파일을 내 로컬 컴퓨터로 전송하면 "파일에 쓸 수 없습니다" 오류가 발생하므로 작동하지 않습니다. 이 문제를 일으키는 버그는 수정되었으나 파일에 액세스할 수 없습니다. 이러한 파일을 얻는 가장 좋은 방법은 무엇입니까?

답변1

Unix에서는 개행 문자가 파일 이름의 다른 문자와 마찬가지로 유효합니다. 셸에서 이 문자는 특별한 의미(명령을 구분함)를 가지므로 다른 특수 문자(예: 공백 ;... )처럼 |인용되어야 합니다.

Bourne과 같은 셸에서는 작은따옴표나 큰따옴표를 사용하여 이 작업을 수행할 수 있습니다.

ls -d 'a
b'

또는:

ls -d "a
b"

일부 쉘(적어도 ksh93FreeBSD zsh)은 다음도 지원합니다.bashmkshsh

ls -d $'a\nb'

의 경우 scp파일 이름이 원격 사용자의 로그인 셸로 전달된다는 점에 유의하세요. 이 작업을 수행할 때:

scp file user@host:something

궁극적으로 사용자의 로그인 셸을 호출하여 host다음을 해석합니다.

scp -t something

명령줄(적어도 openssh에서는). 따라서 쉘이 Bourne과 유사하다면 다음과 같아야 합니다.

scp 'src/a
b' user@host:"dest/'a
b'"

이렇게 하면:

scp 'a
b' user@host:dest/

또는

scp -r src user@host:dest/

서버에서 sshd를 실행합니다:

scp -t dest/

또는

scp -r -t dest/

그리고 파일 이름은 원격 쉘 명령줄을 통해 전달되지 않지만 클라이언트와 서버 사이의 데이터 스트림에 포함됩니다 scp. 그러나 나는 (적어도 openssh 7.2p2의 경우) 개행이 결국 \^J(3자)로 변환된다는 것을 발견했습니다.

따라서 다음 과 ssh같은 다른 메커니즘을 사용하여 파일을 보다 안정적으로 전송할 수 있습니다 .rsyncsftptar

tar cf - src | gzip | ssh user@host 'cd dest && gunzip | tar xpf -'

이는 또한 하드 링크, 소프트 링크 및 기타 파일 속성을 더 잘 보존합니다. 파일 이름에 ASCII가 아닌 문자가 포함되어 있으면 문자 집합 변환도 고려해야 합니다.

답변2

개행 문자가 포함된 기존 파일의 이름을 바꾸려면(개행 문자가 무엇인지 가정), 또는 다음을 사용 ksh93하십시오 zsh.bashmksh

for f in *$'\n'*; do mv -i -- "$f" "${f//$'\n'/}"; done

glob 패턴은 *$'\n'*개행 문자가 포함된 모든 파일 이름과 일치한다는 의미입니다. 이 mv명령은 파일에서 개행 문자의 모든 인스턴스를 제거하여 파일 이름을 바꿉니다.

관련 정보