파일 이름에 "/"를 사용할 수 있습니까?


111

나는 이것이 결코 이루어져야 할 일이 아니라는 것을 알고 있지만 일반적으로 Linux에서 파일 이름 내에서 디렉토리를 구분하는 슬래시 문자를 사용하는 방법이 있습니까?


1
하 디스크 파티션에 직접 액세스하고 어딘가에 '/'문자로 패치하여 파일 이름을 수정할 수 있다고 생각합니다. 무슨 일이 벌어지는 지 흥미로운 질문입니다. 아마도 당신이 원하는 것이 아닐 것입니다.
hochl

1
하지만 짧은 대답은 없어야한다 : 아니, 이것은 지금까지 :-) 수행해야 일이 아니다
시므온 프랜트

FS의 디렉토리 항목에있는 파일 이름에 슬래시를 해킹하는 것이 중요합니까? 권장하지 않습니다. 파일에 액세스 할 수 없습니다.
Jonathan Leffler 2012 년

35
이것은 내 친구가 이름이 지정된 파일을 만든 *다음 "파일을 제거하려면 어떻게해야합니까?"라고 물었던 시간을 생각 나게 합니다. 나는 대답 rm하고 파일 이름을 따랐다. 글쎄, 당신은 나머지를 알고 있습니다.
David Heffernan 2012 년

1
새로운 Linux 사용자의 경우 표현식이나 파일 이름이 확실하지 않은 경우 ls제거 할 파일을 나열한 다음 나중에 ls명령을 변경하는 데 사용 하는 것이 좋습니다 rm.
Dave F

답변:


129

대답은 파일 시스템에 버그가 없으면 할 수 없다는 것입니다. 그 이유는 다음과 같습니다.

fs/namei.ccalled에 정의 된 파일 이름을 바꾸는 시스템 호출이 있습니다 renameat.

SYSCALL_DEFINE4(renameat, int, olddfd, const char __user *, oldname,
                int, newdfd, const char __user *, newname)

시스템 호출이 호출되면 do_path_lookup이름에 대한 경로 조회 ( )를 수행합니다. 이것을 계속 추적하면 다음과 같은 결과를 얻을 수 link_path_walk있습니다.

static int link_path_walk(const char *name, struct nameidata *nd)
{
       struct path next;
       int err;
       unsigned int lookup_flags = nd->flags;

       while (*name=='/')
              name++;
       if (!*name)
              return 0;
...

이 코드는 모든 파일 시스템에 적용됩니다. 이것은 무엇을 의미합니까? 이는 '/'전통적인 방법을 사용하여 파일 이름으로 실제 문자가 있는 매개 변수를 전달하려고 하면 원하는대로 수행되지 않음을 의미합니다. 캐릭터를 이스케이프 할 방법이 없습니다. 파일 시스템이 이것을 "지원"한다면 다음 중 하나 때문입니다.

  • 유니 코드 문자 또는 슬래시처럼 보이지만 그렇지 않은 것을 사용하십시오 .
  • 버그가 있습니다.

당신이 경우 또한, 파일 이름에 슬래시 문자를 추가하고 편집 바이트로 이동, 나쁜 일이 일어날 것입니다. 그 이유는 이름으로이 파일을 참조 할 수 없기 때문입니다. :( 언제라도 Linux는 존재하지 않는 디렉토리를 참조한다고 가정 할 것입니다. 'rm *'기술을 사용하면 bash가이를 파일 이름으로 확장하기 때문에 작동하지 않습니다. 심지어 rm -rf것없는 작업, 간단한 strace를이 일이 후드 (단축) 아래에 이동하는 방법을 알 수 있기 때문에 :

$ ls testdir
myfile2 out
$ strace -vf rm -rf testdir
...
unlinkat(3, "myfile2", 0)               = 0
unlinkat(3, "out", 0)                   = 0
fcntl(3, F_GETFD)                       = 0x1 (flags FD_CLOEXEC)
close(3)                                = 0
unlinkat(AT_FDCWD, "testdir", AT_REMOVEDIR) = 0
...

이러한 호출 unlinkat은 이름으로 파일을 참조해야하기 때문에 실패합니다.


8
또한 최소한 e2fsck모든 파일 이름을 수정해야하는 잘못된 파일 이름으로 간주합니다 . 소스를 참조하십시오 . 따라서 어떻게 든 슬래시가있는 파일 이름으로 끝나면 fsck문제를 해결하는 데 사용할 수 있습니다 .
ehabkost 2014 년

4
@ehabkost 모든 파일 이름을? 버그처럼 사운드 e2fsckP :
flarn2006

36

파일 시스템이 지원한다고 가정하면 "/"로 표시되는 유니 코드 문자 (예 : 중복 된 글리프 )를 사용할 수 있습니다.


42
예, 정확하게 : U + 002F SOLIDUS인 / 만 금지됩니다. 다른 적합한 후보가 많이 있습니다. ⁄은 U + 2044입니다 FRACTION SLASH. ∕는 U + 2215 DIVISION SLASH이고; ⧸는 U + 29F8 BIG SOLIDUS이고; /는 U + FF0F FULLWIDTH SOLIDUS, ╱은 U + 2571은 BOX DRAWINGS LIGHT DIAGONAL UPPER RIGHT TO LOWER LEFT. 모두 훌륭하게 작동합니다!
tchrist

2
그러나 사용자가 파일 / 디렉터리 이름에 실제 문자를 사용하면 어떻게 될까요? 일반적인 이스케이프 솔루션이 필요합니다. 너무 나쁜 Linux의 일반 코드는 문자 그대로 ASCII 0x2F와 일치하기 때문에 아무것도 지원하지 않습니다. ASCII는 적어도 20 년이 지난 지금부터 절대 안됩니다. (유니 코드 1.0은 1991 년부터입니다!)
Evi1M4chine 2016

@tchrist 나는 유니 코드에 의존하지 않는 것을 선호합니다. 그래서 나는 아마 같은 다중 문자 구분 기호를 선호 할 것입니다 ---. 구분 기호 선택은 다른 문자를 사용할 수 있으며 반복 횟수를 변경할 수 있습니다.
Trevor Boyd Smith

다른 파일 시스템에서 금지되는 수많은 문자의 가능한 대체 목록은 내 대답을 참조하십시오. stackoverflow.com/a/61448658/4575793
Cadoiz

9

사용중인 파일 시스템에 따라 다릅니다. 더 인기있는 것 중 일부 :


1
파일 시스템에만 의존하지 않고 모든 * nix 시스템의 시스템 호출은 /를 디렉토리 트리의 구성 요소로 구문 분석합니다.
Blackle Mori

2
슬래시 문자는 파일 시스템과 관계없이 커널에 하드 코딩되어 있습니다 ( grep -r "'/'" *커널 소스에서 시도해보십시오 )
Robert Martin

20
@tchrist 실례합니다. "포워드 슬래시"는 슬래시 문자를 참조 하는 완전히 허용되는 방법으로 슬래시가 어떤 슬래시를 참조 하는지 완전히 명확히 합니다. 때때로 사람들은 혼란 얻을 : P
로버트 마틴

2
하,하지만 @tchrist도 요점이 있다고 생각합니다. 앞으로 '는'/ '를 의미하고'뒤로 '는'\ '를 의미하는 이유는 무엇입니까? 내가 지금까지 가지고있는 가장 좋은 설명은 읽기 / 쓰기시 '/'가 오른쪽 또는 '앞으로'이동하고 '\'가 '왼쪽'또는 '뒤로'이동한다는 것입니다. 왼쪽에서 오른쪽으로. 나는 그 설명이 정말 마음에 들지 않습니다. 부분적으로는 항상 밑에서 내 캐릭터를 쓰고 위로 올라가지 않기 때문입니다. 캐릭터를 쓰면서 위에서부터 아래로 이동하는 것이 더 잘 흐르는 경우가 많다고 생각합니다.
Jesse W. Collins

4
@jwso 이것은 완전히 부수적이지만 이것은 표준, 표준 언어입니다. 슬래시는 유니 코드가 이런 모양의 기호를 부르는 것이 아니라이를 solidus라고 부르는 것이 아니라 "\"는 역방향 solidus로 역 슬래시와 동의어입니다. 그러나 정당화가 필요한 경우 앞뒤는 선이 기울어 지거나 넘어 져야하는 방향이며, 쓰기 방향 (왼쪽에서 오른쪽)을 기준으로합니다. 기울어 지거나 떨어지거나 <== 또는 "\"처럼 보이는 경우 뒤로, "/"처럼 보이는 경우 ==> 앞으로 이동합니다.
Stuart R. Jefferys

4

합의 된 인코딩으로 만. 예를 들어, 당신은 동의 할 수 %로 인코딩됩니다 %%그것은 %2F을 의미합니다 /. 이 파일에 액세스 한 모든 소프트웨어는 인코딩을 이해해야합니다.


19
"어떤 것을 우리는 파울 냄새 것 다른 이름으로 슬래시를 호출"- 셰익스피어
로버트 마틴

1

짧은 대답은 : 아니요, 할 수 없습니다. 디렉토리 구조가 정의되는 방식 때문에 필요한 금지 사항입니다.

그리고 언급했듯이 슬래시처럼 "보이는"유니 코드 문자를 표시 할 수 있지만 그 정도는 충분합니다.


1

일반적으로 파일 이름에 "잘못된"문자를 사용하는 것은 좋지 않습니다. 어떻게 든 관리하더라도 나중에 파일을 사용하기 어렵게 만드는 경향이 있습니다. 파일 시스템 구분자는 전혀 작동하지 않을 것이므로 다른 방법을 선택해야합니다.

URL 인코딩을 고려한 다음 파일 이름으로 사용 했습니까? 결과는 파일 이름으로 괜찮을 것이며 인코딩 된 버전에서 이름을 쉽게 재구성 할 수 있습니다.

또 다른 옵션은 색인을 생성하는 것입니다. 원하는 방법 (순차적으로 번호가 매겨진 이름, SHA1 해시 등)을 사용하여 출력 파일 이름을 만든 다음 생성 된 파일 이름 / URL 쌍으로 파일을 작성합니다. 이를 해시에 저장하고이를 사용하여 URL- 파일 이름 조회를 수행하거나 역 버전의 해시를 사용하여 그 반대로 할 수 있으며, 필요에 따라 작성하고 나중에 다시로드 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.