Допустимые символы в имени файла
где я могу найти список разрешенных символов в именах файлов, в зависимости от операционной системы?
(например, в Linux, символ : разрешен в именах файлов, но не в Windows)
5 ответов:
вы можете начать с Wikipedia Filename страница. Он имеет довольно приличного размера таблицы (сравнение ограничений имени файла) список зарезервированных символов для довольно большого количества файловых систем.
а также зарезервированные имена файлов, такие как
CONпод MS-DOS. Я помню, что был укушен этим однажды, когда я сократил include file fromconst.htocon.hи потратил полчаса, выясняя, почему компилятор завис. Получается Дос проигнорировали расширения для устройств, так чтоcon.hбыло точно так же, какcon, консоль ввода (что означает, конечно, компилятор ждал меня тип файл заголовка, прежде чем он продолжится).
хорошо, так глядя на сравнение файловых систем если вас волнуют только основные проигрыватели файловых систем:
- Windows (FAT32, NTFS): любой Unicode, кроме
NUL,\,/,:,*,",<,>,|- Mac (HFS, HFS+): любой допустимый Юникод, кроме
:или/- Linux (ext[2-4]): любой байт, кроме
NULили/так что любой байт, за исключением
NUL,\,/,:,*,",<,>,|и вы не можете иметь файлы/папки называть.или..и никаких управляющих символов (конечно).
чтобы быть более точным о Mac OS X (теперь называется MacOS)
/в Finder интерпретируется как:в файловой системе Unix.это было сделано для обратной совместимости, когда Apple перешла от классической Mac OS.
законно использовать
/в имени файла в Finder, глядя на тот же файл в терминале он будет отображаться с:.и это работает и наоборот: вы не можете использовать
/в имени файла с именем терминал, но:в порядке и будет отображаться как/в Finder.некоторые приложения могут быть более ограничительными и запрещать оба символа, чтобы избежать путаницы или потому, что они сохранили логику из предыдущей классической Mac OS или для совместимости имен между платформами.
вот код для очистки имени файла в python.
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: https://stackoverflow.com/questions/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
