Linux, Windows 및 OS-X의 크로스 플랫폼 파일 이름에서 안전한 문자


60

현재 YYMMDD-NAME+PAGE대부분의 파일 이름을 사용하고 있습니다. NAME공백을 밑줄로 변환했습니다.

YYYY-MM-DD날짜 형식 을 사용하고 싶지만 이름과 구분하는 방법을 잘 모르겠습니다. -이름이 숫자로 시작하면 A 가 이상하게 보입니다. 를 사용 _하면 공백을 나타내는 밑줄과 충돌합니다.

여기에서 작동하는 파일 이름에서 합리적으로 안전한 문자는 무엇입니까? Linux를 사용하고 있지만 다른 사람 (Windows 7, Mac OS X)과 파일을 공유 할 수 있습니다.


... Unix, Windows, Amiga 1000에서?
slhck

대부분 현대 리눅스.
Martin Ueding

-기호는 Windows 7에서 사용하기에 안전합니다. 다른 최신 운영 체제와 동일 할 수 있습니다. 빼기 기호를 사용하여 구분할 수 있습니다.
Niranjan Singh

답변:


48

요약:

  • Windows : ASCII 제어 문자 및 \/:*?"<>|
  • Linux, OS-X : null 또는 /

모든 플랫폼에서 ASCII 제어 문자와 같은 인쇄 할 수없는 문자를 사용하지 않는 것이 가장 좋습니다.

윈도우

Windows에서 Windows 탐색기는 제어 문자를 허용하지 않거나 \/:*?"<>|공백을 사용할 수 있습니다. 공백을 사용하면 명령 줄에서 사용할 때 파일 이름을 인용 해야하는 경우가 있습니다 (그러나 GUI 응용 프로그램은 내가 아는 한 영향을받지 않습니다). NTFS와 같은 Windows 파일 시스템은 파일 이름으로 인코딩을 저장하지만 UTF-16이 표준입니다.

Windows의 일부 부분은 대소 문자를 구분하고 다른 부분은 대소 문자를 구분하지 않습니다. Windows NTFS 파일 시스템에서 "Ab"및 "ab"와 같은 고유 한 파일 이름을 쉽게 만들 수 있습니다. 이러한 이름은 별개의 개별 컨텐츠를 포함하는 별도의 파일을 나타냅니다. 그러나 Windows 명령 프롬프트는을 사용하여 두 파일을 모두 행복하게 나열하지만, ​​같은 명령을 사용하여 두 파일 dir중 하나에 쉽게 액세스하거나 조작 할 수는 없습니다 type. 아래를 참조하십시오.

리눅스, OS-X

Linux 및 OS-X /에서는 인쇄 가능한 ASCII 세트 만 금지됩니다. 일부 문자 (와 같은 셸 메타 문자 *?!)는 명령 행에서 문제를 일으키며 파일 이름을 적절히 인용하거나 이스케이프해야합니다.

ext2, ext3과 같은 Linux 파일 시스템은 문자 집합에 구애받지 않습니다 (문자열을 바이트 스트림으로 처리한다고 생각합니다-null 만 /허용되며 금지됩니다). 즉, 파일 이름을 UTF-8 인코딩으로 저장할 수 있습니다. 표시 또는 처리를 위해 파일 이름을 올바르게 변환하는 데 사용할 인코딩을 아는 것은 셸 또는 다른 응용 프로그램에 달려 있다고 생각합니다.

결론

그래서 당신은 아마 안전한 것을 사용할 수 있습니다 (입력하기가 어렵지 않은 경우)


Windows의 대소 문자 구분

C> dir /B
Ab
aB
аB

C> type Ab
b
b

C> type aB
b
b

C> type аB
unicode homograph

두 번째 파일의 내용을 입력 할 수 없으며 Windows type명령은 Ab의 내용을 대신 반환합니다. 세 번째 파일은 Linux의 aB 와도 다릅니다.

(Windows 10 NTFS).


1
대체로 좋은 대답이지만 공백에서 파일 이름을 사용하지 않는 것이 좋습니다. 모든 상황에서 올바르게 탈출하는 것이 가치가 있습니다. Microsoft는 시스템 디렉토리 이름에 공백 사용을 중지했습니다. 이름에 단어 경계를 표시 해야하는 경우 CamelCase가 잘 작동합니다.
Isaac Rabinovitch

4
"C : \ Program files (x86)"가 Win8에 여전히 존재합니다. 시스템 디렉토리가 아니십니까? 공간이 문제를 일으킬 수 있다는 데 동의합니다.
RedGrittyBrick

그러나 이름을 거의 다른 것으로 바꿀 수 있습니다. 물론 이름을 "] : \ foobar"로 바꾸면 많은 프로그램이 겁에 질리지 만 Windows는 "% programfiles (x86) %"라고합니다.
Marcks Thomas

2
여기서 명심해야 할 것은 리눅스 시스템은 대문자와 소문자를 구별하는 것으로 간주 할 수 있지만 Windows는 그것들을 동일하게 간주하는 것입니다.
thecoshman

1
파싱 ​​할 때 얼마나 많은 프로그램이 빨라지는지 놀랄 것이다. 이것이 Windows 9가없는 이유입니다.
Isaac Rabinovitch

46

RedGrittyBrick의 답변은 기술적으로 정확하지만 안전성은 유일한 문제가 아니라 사용성도 중요합니다. 더 좋은 질문은 "파일 이름에 어떤 문자를 사용하는 것이 좋을까"입니다.

몇 가지 잠재적 지침 :

  • [0-9a-zA-Z_] -영숫자와 밑줄은 항상 사용하기에 좋습니다.
  • \/:*?"<>|그리고 널 바이트는 적어도 하나의 시스템에 문제가있다,해야하고 항상 피할 수.
  • 공백 은 많은 시스템에서 인수 구분 기호로 사용되므로 가능하면 공백이있는 파일 이름은 사용하지 않아야합니다. 다른 공백 (예 : 탭)은 훨씬 더 그렇습니다.
  • 세미콜론 (;) 은 많은 시스템에서 명령을 분리하는 데 사용됩니다. 세미콜론과 쉼표 (,) 는 Windows 명령 행 에서 (일부 버전?) 명령 행 인수를 구분하는 데 사용됩니다 .
  • []()^ #%&!@:+={}'~그리고 [`] 모두 많은 껍질에서 특별한 의미를 지니고 있으며 해결하기가 성가 시므로 피해야합니다. 또한 URL에서 끔찍한 경향이 있습니다.
  • 피해야 할 주요 인물 :
    • 많은 명령 행 프로그램은 하이픈 [-] 을 사용하여 특수 인수를 나타냅니다.
    • * nix 기반 시스템 은 숨김 파일 및 디렉토리의 주요 문자로 전체 정지 [.] 를 사용합니다.
  • ASCII 세트에 없는 것은 오래된 시스템 또는 더 많은 기본 시스템 (예 : 일부 내장 시스템)에서 문제를 일으킬 수 있으므로주의해서 사용해야합니다.

기본적으로 당신을 떠난다 :

[0-9a-zA-Z -._]

것을 항상 사용하는 성가신 안전하지 (한 당신이 파일 이름을 시작으로 알파 숫자) :


1
중괄호 ( [])는 정규 표현식의 일부이며 쉘에서도 특별한 의미를 갖습니다. 그러나 일부 악의적 인 경우를 제외하고는 그다지 좋지 않습니다.
Martin Ueding

1
흠 ... ()실제로 같은 말을 할 수있을 것 같아요 .
naught101

4
zsh에서는 다르게 해석 될 수있는 문자가 포함 []()^;되므로 실제로 정답은 [0-9a-zA-Z.,_-]쉼표가 파일 이름에서 볼 수 있기 때문에 쉼표가 제외 될 수 있다고 생각합니다. 문제.
Casey Rodarmor

그래, 나는 최종 목록에서 제거
naught101

1
쉼표는 성 echo whereami > a,b,c가실 수 있습니다 .Win10 명령 프롬프트 창에서 시도하십시오 .
RedGrittyBrick

4

당신은 할 수 있습니다 :

  1. 현재 밑줄을 #(공간에 대한 판독기 기호)로 바꿉니다.
  2. 파일 이름에서 '섹션'날짜까지 밑줄 (또는 두 번째 하이픈-입력하기 쉬움)

Alt-1. 초기 대문자는 공백을 대체 할 수 있습니다. YYMMDD-HHMM-FileName.ext또는YYMMDD-HHMM_FileName.ext

Jan-Sep (& 1st-9th ea mo)에 대해 패딩 된 0으로 자동 정렬하는 명확한 표시를위한 최소 문자.

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