파일 이름에 허용되는 문자 있습니까? (예 : Linux의 경우 문자

운영 체제에 따라 파일 이름에서 허용되는 문자 목록을 어디에서 찾을 수 있습니까? (예 : Linux의 경우 문자 :는 파일 이름에 허용되지만 Windows에는 허용되지 않습니다)



답변

Wikipedia Filename 페이지 에서 시작해야 합니다. 적당한 크기의 테이블 ( 파일 이름 제한 비교 )이 있으며 많은 파일 시스템에 예약 된 문자가 나열되어 있습니다.

또한 MS-DOS 와 같은 예약 된 파일 이름을 포함하여 각 파일 시스템에 대한 기타 정보가 많이 CON있습니다. 필자는 include 파일을 짧게 하고 컴파일러가 중단 된 이유를 알아내는 데 30 분을 보냈 const.h을 때 한 번 물 렸기 때문에 언급했습니다 con.h.

입력 콘솔 과 정확히 동일 하도록 DOS 에서 장치의 확장명을 무시했습니다 (물론 컴파일러는 헤더 파일을 계속 입력 하기를 기다렸습니다 ).con.hcon


답변

메인 플레이어 파일 시스템에만 관심이 있다면 파일 시스템 비교를 살펴 보십시오.

그래서 어떤 바이트를 제외하고는 NUL, \, /, :, *, ", <, >, |당신이 파일을 가질 수 없습니다 / 폴더를 호출하지 ...(물론)과 더 제어 문자.


답변

Windows OS에서 파일을 작성하고 파일 \이름 과 같이 유효하지 않은 문자를 제공하십시오 . 결과적으로 파일 이름에 유효하지 않은 문자가 모두 포함 된 팝업이 나타납니다.

여기에 이미지 설명을 입력하십시오


답변

/Finder에서 Mac OS X (현재 MacOS) 에 대해 더 정확하게 설명 :하는 것은 Unix 파일 시스템에서 해석됩니다 .

Apple이 Classic Mac OS에서 이동할 때 이전 버전과의 호환성을 위해 수행되었습니다.

/Finder에서 파일 이름에 a 를 사용하는 것이 합법적이며 터미널에서 동일한 파일을 보면으로 표시됩니다 :.

그리고 다른 방법으로도 작동합니다 /. 터미널과 함께 파일 이름에 a를 사용할 수 :는 없지만 a 는 OK이며 /Finder에 a 로 표시됩니다 .

일부 응용 프로그램은 혼란을 피하기 위해 또는 이전 Classic Mac OS의 논리를 유지하거나 플랫폼 간의 이름 호환성을 위해 더 제한적이고 두 문자를 모두 금지 할 수 있습니다.


답변

“영어 로캘”파일 이름의 경우이 기능이 훌륭합니다. 업로드 된 파일 이름을 삭제하는 데 이것을 사용하고 있습니다. 파일 이름은 디스크의 어떤 것에도 연결되어 있지 않습니다. 파일을 다운로드 할 때를위한 것이므로 경로 확인이 없습니다.

$file_name = preg_replace('/([^\x20-~]+)|([\\/:?"<>|]+)/g', '_', $client_specified_file_name);

기본적으로 Windows 및 기타 OS에서 인쇄 할 수없고 예약 된 모든 문자를 제거합니다. 다른 로케일 및 기능을 지원하기 위해 패턴을 쉽게 확장 할 수 있습니다 .


답변

다음은 파이썬에서 파일 이름을 정리하는 코드입니다.

import unicodedata

def clean_name(name, replace_space_with=None):
    """
    Remove invalid file name chars from the specified name

    :param name: the file name
    :param replace_space_with: if not none replace space with this string
    :return: a valid name for Win/Mac/Linux
    """

    # ref: https://en.wikipedia.org/wiki/Filename
    # ref: /programming/4814040/allowed-characters-in-filename
    # No control chars, no: /, \, ?, %, *, :, |, ", <, >

    # remove control chars
    name = ''.join(ch for ch in name if unicodedata.category(ch)[0] != 'C')

    cleaned_name = re.sub(r'[/\\?%*:|"<>]', '', name)
    if replace_space_with is not None:
        return cleaned_name.replace(' ', replace_space_with)
    return cleaned_name


답변