파일 이름에 공백이 허용되지 않습니까?


31

일반적으로 Unix 및 Linux에서는 파일의 파일 이름 (일반 파일, dir, 링크, 장치 파일 등)에 공백이 없어야합니다.

그러나 나는 항상 그렇게합니다. 내부에 공백이있는 파일 이름의 경우

  • 노틸러스에서는 공백 문자가 공백으로 표시됩니다.
  • Bash 터미널에서 \ 공백을 나타내는 데 사용 하거나 파일 이름을 큰 따옴표로 묶습니다.
  • 일부 응용 프로그램 파일 (노틸러스, OS도 그렇게하는지 확실하지 않음)에서 파일 이름은 공백으로 대체되어 기록됩니다 %20.

파일 이름에 공백이 실제로 허용되지 않습니까?

파일 이름의 공백을 올바르게 사용하거나 처리하는 방법은 무엇입니까?


17
허용되지만 실제로는 정말 성가시다. 그럴 이유가 없습니다. 하지마
Monica와의 가벼움 경주

3
-rf ~(use touch -- "-rf ~") 라는 파일을 만들 수도 있지만 권장하지는 않습니다.
Ian D. Scott

5
"cd"라는 자체 소멸 스크립트를 작성하는 것과 같이 허용되지만이를 수행해서는 안됩니다. 파일이 3 가지 도구에서 이미 다르게 보입니다. 충분하지 않습니까?
팔코

7
모든 사람이 그것이 정말로 성가신다는 의견을 공유하는 것은 아닙니다. 그리고 "이유가 없다"는 것은 명백히 거짓이므로 반박 할 필요가 없습니다. 나는 몇 년 전에 공간을 올바르게 처리하는 방법을 주었고 배웠으며, 대부분 큰 문제는 아닙니다.

2
@snailboat Spaces는 표준화가 부족한 실제 문제의 증상입니다. 유닉스 파일 시스템은 파일 "이름"을 거의 무제한 바이너리 바이너리로 만들 수 있습니다. 유일하게 잘못된 바이트는 0과 47 ( /구분자)입니다. 남은 254 바이트를 모두 사용하면 말할 수없는 엘드리치 "이름"의 모든 방식이 열립니다. 분명히 이것은 미친 짓이지만 모든 사람이 "정신"에 동의하지는 않으며, 다른 캐릭터가 다른 도구를 깨뜨릴 수 있습니다. 모든 사람의 정신의 교차점은 매우 작습니다 .
jw013

답변:


48

공백, 실제로 /NUL을 제외한 모든 문자 는 파일 이름에 허용됩니다. 파일 이름에 공백을 사용 하지 않는 것이 파일 이름을 제대로 지원하지 않는 소프트웨어에 의해 잘못 해석 될 위험이 있습니다. 아마도 그러한 소프트웨어는 버그가 있습니다. 그러나 쉘 스크립팅과 같은 프로그래밍 언어는 파일 이름에 공백이있는 경우 깨지는 소프트웨어를 작성하기가 너무 쉽습니다. 이러한 버그는 개발자가 공백 파일이있는 파일 이름을 사용하여 쉘 스크립트를 테스트하지 않기 때문에 자주 버그가 발생합니다. 그들.

대체 된 공백 %20은 파일 이름에 자주 표시되지 않습니다. 그것은 주로 (웹) URL에 사용됩니다. URL의 %-인코딩이 종종 실수로 파일 이름으로 들어가는 것은 사실입니다.


6
"URL 인코딩"또는 "백분율 인코딩" en.wikipedia.org/wiki/URL_encoding 가장 적합한 이름은 아마도 "URI 인코딩"일 것입니다. 그러나 사람들 은 URI 보다 URL 을 말하기가 더 쉽다는 것을 알기 때문에 이것은 일반적인 형식입니다. 그릇된 명칭. URI의 예약 문자 세트가 * nix 파일 이름보다 더 큰 것을 확인하십시오.
goldilocks

1
@Tim의 명령 줄 인수에 NUL 문자를 지정할 있다는 것을 모르겠습니다 bash. Ctrl-V로 인용하는 것과 같은 몇 가지를 시도했지만 $(echo -e \\0)작동하지 않았습니다. 문제는 NUL을 파일 이름으로 사용할 수없는 이유는 C 문자열 (문자열 종결 자이기 때문에)에서 사용할 수 없으며 모든 기본 API뿐만 아니라 C 프로그램에서 처리하는 거의 모든 문자열이 해당 형식을 사용하기 때문입니다 . 이후 bashC로 작성, 단순히 그들 NUL있는 모든 문자열을 전혀 지원이되지 않을 수 있습니다. 내가 틀렸을 수도 있고, 모호한 방법이있을 수도있다.
Celada

1
상황은 상황에 따라 다릅니다. 문자열 함수는 일반적으로 최종 null을 계산하지 않습니다 (또는 첫 번째 null은 문자열이 끝날지라도 문자열의 끝입니다). 따라서 길이가 0이므로 비어있는 것으로 간주됩니다.
goldilocks

3
@Celada는 물론 사용 NUL하고 쓸 수 있습니다 $'\0'. 예를 들면 :find . -print0 | while read -d $'\0' f; do echo "$f"; done
terdon

1
@goldilocks 사람들이 URL을 'url'로 발음 하는가?
Miles Rout

17

관찰 한대로 파일 이름에 공백 허용됩니다.

wikipedia의이 차트에서 "대부분의 UNIX 파일 시스템"항목을 보면 다음을 알 수 있습니다.

  • 모든 8 비트 문자 세트가 허용됩니다. 이 우산 아래에서도 7 비트 ASCII를 사용할 수 있습니다. 다양한 8 비트 세트의 하위 세트이며 항상 8 비트 바이트를 사용하여 구현되기 때문입니다.

  • 금지 된 문자는 /"null"입니다. "Null"은 0 바이트를 나타내지 만 텍스트 데이터에는 허용되지 않습니다.

그러나 쉘을 사용하면 번거 로움을 유발하는 문자가 *POSIX globbing 연산자라는 것을 알 수 있습니다.

"번거 로움"을 정의하려는 방법에 따라 공백 (탭, 탭, 개행 등)을 포함 할 있습니다 "". 그러나 공백이 허용되므로 불가피합니다.

파일 이름의 공백을 올바르게 사용하거나 처리하는 방법은 무엇입니까?

셸 / 명령 줄 컨텍스트에서 파일 이름을 작은 따옴표 나 큰 따옴표로 묶거나 ( 다른 WRT와 다른 문제 는 아님) 다음과 같이 공백을 이스케이프하십시오 \.

> foo my\ file\ with\ spaces\ in\ the\ name

1
bash에서 NUL 문자를 어떻게 지정합니까? 파일 이름으로 테스트하고 싶습니다.
Tim

1
당신은 할 수 없습니다. "execve semantics"는 C (및 내가 알고있는 다른 모든 언어)에서 텍스트 문자열이 null로 종료된다는 사실을 나타냅니다. 쉘은 C.에서 sneakest I가 생각할 수있는 것은 구현 touch $(echo -e "foo\00bar")- -e프로세스 \0N8 진수로,하지만 그건 그냥라는 이름의 파일을 생성로 여전히 손실 어딘가를 가져옵니다 foobar. 물론 NULL은 인쇄 할 수 없지만 C 문자열 제한으로 인해 거기에서 사라졌습니다.
goldilocks

"텍스트 문자열이 널로 종료되었습니다" -> 추가 설명 : 문자열은 항상 0 바이트로 저장되므로 텍스트에 "허용되지 않습니다": 문자열을 삽입하면 문자열이 효과적으로 종료됩니다 그 시점에서. 예를 들어, 대부분의 의도와 목적으로 foo[NULL]bar끝납니다 foo. 그와 함께 발생하지 않는 사실 echo -e은 NULL을 잘라냅니다.
goldilocks

5
대부분의 프로그래밍 언어는 문자열에 널 문자를 허용합니다. 유닉스를 기반으로하는 C가 아닌 주요 언어는 대부분의 유닉스 쉘에서 문자열에 널 문자를 허용하지 않습니다. 어쨌든 @Tim의 모든 Unix 인터페이스는 null로 끝나는 문자열을 사용하므로 null 바이트는 파일 이름에서 가질 수없는 것 중 하나입니다 (플러스 /구분 기호이며 따옴표로 묶을 수 없으므로 경로 이름이 될 수 있음) 파일 이름이 아님).
Gilles 'SO- 악마 그만

1
...하지만 [다시 신경 쓰지 마세요]. 어쨌든 내가 너무 자주 할 일이 아닙니다. 제 생각에는 그들이 텍스트 데이터에있을 이유가 없습니다. 나는 그것을 고쳤을 것입니다, 그러나 그것은 주석입니다.
goldilocks

3

그 이유는 대체로 역사적입니다. 시간 공간이 파일 이름에 허용되지 않은 안개로 되돌아 가기 때문에 공백은 키워드 / 파일 이름 구분 기호로 사용되었습니다. 미래의 쉘 인터프리터는 이전 스크립트와 역 호환되어야하므로 오늘날의 두통에 시달리고 있습니다.

사람을 많이 다룰 필요가없는 프로세스 개발자는 공간을 완전히 떨어 뜨려 훨씬 쉽게 작업 할 수 있습니다. Apple은 / System / Library / CoreServices /의 내용에 공간이 거의 없으며 사용자를 대신하여 공간이있는 프로그램이 열리고 WouldLookStrangeIfCamelCased가 수행됩니다. 비슷한 유닉스 전용 경로도 공백을 피합니다.

(일부 관련된 일화 : 90 년대 중반 Windows 드론은 "Windows에서는 할 수없는 Mac에서 할 수있는 한 가지 이름을 지정하십시오"-> "파일 이름에 12자를 사용하십시오."-> Silence. 그 12 자에서도 가능합니다)


1
V6 Unix (c. 1978 년)를 사용했습니다. 그때 공간 허용 되었습니다 . 내가해야 할 한 가지 작업은 파일 시스템을 구문 분석하는 프로그램 (직접 디스크 i / o 사용)을 작성하고 그 이름에 공백과 백 스페이스가있는 파일을 찾는 것입니다.
wallyk

공백을 모두 삭제합니까? 아니면 파일 이름에 공백이 거의 없습니까?
mikeserv

2

따라서 다른 곳에서 여러 번 언급했듯이 파일 이름에는 거의 모든 문자가 포함될 수 있습니다. 그러나 파일 이름파일아니라고 말해야 합니다. 일반적으로 파일을 열려면 파일 이름이 필요 하지만 파일 이름 은 실제 파일 만 가리킴 에 따라 파일 특성 으로 약간의 가중치가 적용됩니다 . 링크는 inode 번호 와 함께이를 기록한 디렉토리에 저장되는 링크 입니다. 이는 실제 파일에 훨씬 가까운 근사값 입니다.

알다시피, 원하는대로 부르십시오. 커널은 신경 쓰지 않습니다-처리 할 모든 파일 참조는 어쨌든 실제 inode 번호를 처리합니다. 파일 이름은 사람이 소비 하는 것입니다 - 파일을 미치게 만들고 싶다면 파일 시스템입니다. 여기, 나는 미친 물건을 할 것입니다 :

먼저 20 개의 파일을 만들고 공백없이 이름을 지정합니다. 각 파일 이름에는 마지막 파일보다 하나 이상의 공간이 포함됩니다.

until [ $((i=$i+1)) -gt 20 ]
do  v=$v' ' && touch ./"$v"
done

이건 좀 웃겨요 내 봐 ls:

ls -d ./*
./      ./          ./              ./                  ./                 
./      ./          ./              ./                  ./                  
./      ./          ./              ./                  ./                   
./      ./          ./              ./                  ./     

이제이 디렉토리를 미러링하겠습니다 :

set -- * ; mkdir ../mirror
ls -i1qdU -- "$@" |
sh -c 'while read inum na
    do  ln -T "$1" ../mirror/$inum
    shift ; done' -- "$@"
ls -d ../mirror/*

../mirror/내용 은 다음과 같습니다 .

../mirror/423759  ../mirror/423764  ../mirror/423769  ../mirror/423774
../mirror/423760  ../mirror/423765  ../mirror/423770  ../mirror/423775
../mirror/423761  ../mirror/423766  ../mirror/423771  ../mirror/423776
../mirror/423762  ../mirror/423767  ../mirror/423772  ../mirror/423777
../mirror/423763  ../mirror/423768  ../mirror/423773  ../mirror/423778

좋아,하지만 아마도 당신은 묻는다-그러나 그것은 무엇이 좋은가? 어떤 것이 무엇인지 어떻게 알 수 있습니까? 올바른 inode 번호를 올바른 파일 이름에 어떻게 연결했는지 어떻게 확인할 수 있습니까?

잘...

echo "heyhey" >>./'    ' 
tgt=$(ls -id ./'    ')
cat ../mirror/${tgt%% .*} \
    $(ls -1td ../mirror/* | head -n1) 

산출

heyhey
heyhey

포함 된 inode 번호 ../mirror/"${tgt%% .*}"와 참조 된 inode 번호 ./' '는 동일한 파일 을 참조하십시오. 그들은 같은 파일을 설명합니다. 그들은 이름을 지었지만 더 이상은 없습니다. 수수께끼는 없지만 실제로는 약간의 불편 함이 있지만 결국 유닉스 파일 시스템의 작동에는 거의 영향을 미치지 않습니다.

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