내 서버의 일부 파일에 실수로 개행 문자가 저장되었습니다. file?name.txt
서버에서 파일을 볼 때 나타납니다 . scp를 사용하여 이러한 파일을 내 로컬 컴퓨터로 전송하면 "파일에 쓸 수 없습니다" 오류가 발생하므로 작동하지 않습니다. 이 문제를 일으키는 버그는 수정되었으나 파일에 액세스할 수 없습니다. 이러한 파일을 얻는 가장 좋은 방법은 무엇입니까?
답변1
Unix에서는 개행 문자가 파일 이름의 다른 문자와 마찬가지로 유효합니다. 셸에서 이 문자는 특별한 의미(명령을 구분함)를 가지므로 다른 특수 문자(예: 공백 ;
... )처럼 |
인용되어야 합니다.
Bourne과 같은 셸에서는 작은따옴표나 큰따옴표를 사용하여 이 작업을 수행할 수 있습니다.
ls -d 'a
b'
또는:
ls -d "a
b"
일부 쉘(적어도 ksh93
FreeBSD zsh
)은 다음도 지원합니다.bash
mksh
sh
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
같은 다른 메커니즘을 사용하여 파일을 보다 안정적으로 전송할 수 있습니다 .rsync
sftp
tar
tar cf - src | gzip | ssh user@host 'cd dest && gunzip | tar xpf -'
이는 또한 하드 링크, 소프트 링크 및 기타 파일 속성을 더 잘 보존합니다. 파일 이름에 ASCII가 아닌 문자가 포함되어 있으면 문자 집합 변환도 고려해야 합니다.
답변2
개행 문자가 포함된 기존 파일의 이름을 바꾸려면(개행 문자가 무엇인지 가정), 또는 다음을 사용 ksh93
하십시오 zsh
.bash
mksh
for f in *$'\n'*; do mv -i -- "$f" "${f//$'\n'/}"; done
glob 패턴은 *$'\n'*
개행 문자가 포함된 모든 파일 이름과 일치한다는 의미입니다. 이 mv
명령은 파일에서 개행 문자의 모든 인스턴스를 제거하여 파일 이름을 바꿉니다.