이름에 백슬래시\가 포함된 파일을 삭제하거나 액세스하는 방법은 무엇입니까?

이름에 백슬래시\가 포함된 파일을 삭제하거나 액세스하는 방법은 무엇입니까?

나는 Python 모듈 pysftp를 사용하여 일부 파일을 이 Linux 상자에 복사했습니다.

[jm@spartan tf]$ ls -la
total 0
drwxrwxrwx. 3 jm jm  69 Aug 14 13:50 .
drwxrwxrwt. 9 root    root    238 Aug 14 13:49 ..
-rwxrwxrwx. 1 jm jm   0 Aug 14 13:49 .\gitkeep
drwxrwxrwx. 2 jm jm   6 Aug 14 13:50 .\innerfile
-rwxrwxrwx. 1 jm jm   0 Aug 14 13:50 .\innerfile\gitkeep
[jm@spartan tf]$ rm .\gitkeep
rm: cannot remove ‘.gitkeep’: No such file or directory

숨겨져 있어서 어떻게 복사해서 숨길 수 있을지 계속 고민 중인데 동시에 삭제하고 싶은데 그럴 수가 없어요. 여기서 무슨 일이 일어나고 있는 걸까요?

CentOS 7을 사용하고 있습니다.

답변1

실제로 해야 할 일은 Windows 경로를 Unix 경로로 변환하도록 스크립트를 수정하는 것입니다. 비교적 간단한 접근 방식은 경로 구분 기호를 방정식에서 제외하는 것입니다. 복사할 전체 경로 이름을 제공하는 대신 디렉터리를 재귀적으로 탐색하고 원격 측에 대상 디렉터리를 생성한 다음 전체 경로 대신 파일 이름만 지정합니다. :)

하지만 그 지점에 도달하기 전에 셸에서 백슬래시를 보호해야 합니다. 작은따옴표로 인용하면 됩니다(백슬래시는 큰따옴표 안의 특정 문자로 해석됩니다). 특히 와일드카드는 따옴표 밖에 있으므로 쉘은 이를 리터럴이 아닌 와일드카드로 처리합니다 *. :)

rm -rv '.\'*

또는 백슬래시를 이스케이프 처리하여 수행할 수 있습니다(큰따옴표 안에서도 작동하지만 여기서는 필요하지 않습니다).

rm -rv .\\*

와일드카드를 사용하여 항목을 삭제하기 전에 항상 동일한 매개변수를 사용하여 먼저 실행 한 ls다음 위쪽 화살표를 사용하여 . :) 나는 또한 이런 상황에서 with를 사용하는 것을 정말 좋아합니다 .lsrm-vrm

sauer@lightning:/tmp> ls -vr .\\*
.\innerfile\gitkeep  .\gitkeep

.\innerfile:
sauer@lightning:/tmp> rm -vr .\\*
removed '.\gitkeep'
removed directory '.\innerfile'
removed '.\innerfile\gitkeep'

답변2

파일 이름에 이스케이프 문자가 포함되어 있으므로 \이스케이프 문자를 이스케이프해야 합니다.

rm .\\gitkeep .\\innerfile\\gitkeep
rmdir .\\innerfile 

파일이 삭제됩니다

답변3

다른 모든 방법이 실패하면 다음을 수행하여 이름에 백슬래시나 이상한 문자가 포함된 파일과 폴더를 삭제할 수 있습니다.

rm -iR *

위 명령은 현재 있는 폴더의 모든 내용을 삭제하는 프로세스를 시작합니다. 그러나 각 파일이나 폴더를 삭제하기 전에 메시지가 표시됩니다.

rm: remove regular file `.\gitkeep? y
rm: remove regular file `.\innerfile\gitkeep'? y

삭제하려는 각 파일이나 폴더에 대해 "y"를 입력하고 [Enter] 키를 눌러야 합니다. 삭제하고 싶지 않은 파일이나 폴더가 나타나면 "n"을 입력하고 [Enter] 키를 누르세요.

남은 파일과 폴더를 모두 입력하라는 메시지가 계속 표시되지만 삭제하려는 항목을 이미 삭제한 경우 다음 키 조합을 누르세요.

[Ctrl] + [c]

관련 정보