Поиск по сайту:

Как работать с пробелами в именах файлов в Linux


Резюме: Если у вас есть имя файла с пробелами в системе Linux, заключите ваше имя файла в кавычки, чтобы Bash обработал его правильно. Автодополнение с помощью табуляции упрощает ввод имен файлов в командной строке, даже если они содержат пробелы.

Как и большинство операционных систем, Linux поддерживает имена файлов с пробелами. Но использовать эти имена файлов в командной строке не всегда просто. Вот несколько способов обработки имен файлов, содержащих пробелы.

Скромное имя файла

Все, что хранится на жестком диске вашего компьютера, должно иметь имя. Без имени файлы не существовали бы. Все приложения и демоны, которые запускаются при загрузке компьютера, а также все программное обеспечение, которое вы используете, должны быть идентифицированы и сохранены в файловой системе. Эта идентификация и есть имя файла».

То же самое относится и к файлам, которые вы создаете или устанавливаете. Всем вашим документам, изображениям и музыке нужны имена файлов. Без имен файлов ни один из ваших цифровых активов не мог бы существовать. Поскольку имена файлов очень важны, Linux изо всех сил старается наложить как можно меньше правил на их состав.

В Linux имя файла может содержать любой символ, кроме косой черты «/» и нулевого символа, 0x00. Нулевой символ используется для обозначения конца строки, поэтому он не может присутствовать в самой строке, иначе Linux обрезает имя файла в позиции нулевого символа. Косая черта «/» используется в качестве разделителя в путях к каталогам.

Имена файлов вводятся с учетом регистра и могут иметь длину до 255 байт, включая нулевой символ. Пути к каталогам могут иметь длину до 4096 байт, включая нулевой символ. Обратите внимание, что это их длина в байтах, что может не соответствовать непосредственно символам. Например, 16-битные символы Unicode занимают два байта каждый.

Энтузиасты ретро-компьютеров и те, у кого долгая память, знают, что на заре персональных компьютеров дисковая операционная система Microsoft, DOS, была нечувствительна к регистру и имела ограничение имени файла до восьми символов плюс трехсимвольное расширение.

Вы должны были быть очень вдумчивыми, а иногда и творческими, когда давали имена файлам. Для сравнения, свобода, которую мы имеем сегодня, означает, что мы можем называть файлы как угодно, не задумываясь ни о чем, кроме описания, которое мы создаем для этого файла.

Но с именами файлов чаще всего нас сбивают с толку не символы, которые мы печатаем, а пробелы между ними.

Почему пробелы в именах файлов Linux доставляют неудобства

Оболочки, такие как Bash, будут интерпретировать строку слов, разделенных пробелами, как отдельные аргументы команды, а не как отдельный аргумент. Вот пример использования touch для создания нового файла с именем «мой новый файл.txt».

touch my new file.txt
ls

Как мы видим, ls показывает нам, что создано три файла: один с именем «мой», другой с именем «новый» и еще один с именем «file.txt».

Обратите внимание, что touch не жаловался и не выдавал ошибку. Он выполняет то, о чем, по его мнению, мы его просим. Так что он молча возвращает нас в командную строку. Если у нас нет мотивации проверять, мы не узнаем, что что-то пошло не по плану.

Чтобы создать нужный нам файл, нам нужно взять в кавычки или экранировать.

Как ставить кавычки и экранировать пробелы

Если мы цитируем все имя файла, touch знает, что ему нужно рассматривать текст в кавычках как один аргумент.

touch 'my new file.txt'
ls

На этот раз мы получаем тот единственный файл, который и ожидали.

Мы можем получить тот же результат, если воспользуемся символом обратной косой черты «\», чтобы избежать пробелов. Благодаря «экранированию» пробелов они не рассматриваются как специальные символы — то есть разделители аргументов — они считаются обычными старыми пробелами.

touch my\ second\ new\ file.txt
ls

Это работает, но экранирование пробелов делает ввод имен файлов медленнее и подвержен ошибкам. Все может стать очень уродливым, если у вас есть имена каталогов с пробелами.

cp dir one/my\ text\ file.txt dir\ two/my\ text file.bak
ls

Эта команда копирует один текстовый файл из каталога с именем «dir one» в каталог с именем «dir two» и сохраняет копию как файл BAK. И это достаточно простой пример.

Как решить проблему с пространством в ее источнике

Если это ваши собственные файлы, вы можете принять политическое решение никогда не использовать пробелы и создавать (или массово переименовывать) имена файлов, подобные этому.

mynewtextfile.txt

По общему признанию, это надежное решение, но все же уродливое. Есть лучшие варианты, такие как использование тире «-» или подчеркивания «_» для разделения слов.

my-new-text-file.txt
my_new_text_file.txt

Оба они помогут обойти проблему, и они читабельны. Если вы не хотите добавлять дополнительные символы в имена файлов, вы можете использовать CamelCase, чтобы сделать ваши имена файлов читабельными, например:

MyNewTextFile.txt

Расширение вкладок упрощает работу с пробелами

Конечно, принятие соглашения об именах и его соблюдение поможет только тогда, когда вы имеете дело со своими собственными файлами. Файлы, поступающие откуда-то еще, вряд ли будут следовать принятому вами соглашению об именах.

Вы можете использовать расширение табуляции, чтобы помочь вам точно «заполнить» имена файлов для нас. Допустим, мы хотим удалить BAK-файл, который мы создали во «втором каталоге», используя rm.

Мы начинаем с ввода «rm dir», потому что используем команду rm и знаем, что имя каталога начинается с «dir».

rm dir

Нажатие клавиши «Tab» заставляет Bash сканировать совпадения в текущем каталоге.

Есть два каталога, которые начинаются с «dir», и в обоих случаях следующим символом является пробел. Поэтому Bash добавляет символ обратной косой черты «\» и пробел. Затем Bash ждет, пока мы предоставим следующий символ. Ему нужен следующий символ, чтобы различать два возможных совпадения в этом каталоге.

Мы напечатаем «t» для «два», а затем снова нажмем «Tab».

Bash дополняет за нас имя каталога и ждет, пока мы введем начало имени файла.

У нас есть только один файл в этом каталоге, поэтому достаточно ввести первую букву имени файла «m», чтобы сообщить Bash, какой файл мы хотим использовать. Ввод «m» и нажатие «Tab» завершает имя файла для нас, а «Enter» выполняет всю команду.

Расширение вкладок позволяет легко убедиться, что вы правильно называете имена файлов, а также ускоряет навигацию и набор текста в командной строке в целом.

Как использовать имена файлов с пробелами в сценариях Bash

Неудивительно, что скрипты имеют те же проблемы с пробелами в именах файлов, что и командная строка. Если вы передаете имя файла в качестве переменной, убедитесь, что вы указали имя переменной в кавычках.

Этот небольшой скрипт проверяет текущий каталог на наличие файлов, соответствующих шаблону файлов «*.txt», и сохраняет их в переменной с именем file_list. Цикл for используется для выполнения простого действия над каждым из них.

#!/bin/bash

file_list=*.txt

for file in $file_list
do
  ls -hl $file
done

Скопируйте этот текст в редактор и сохраните его в файл с именем «files.sh». Затем используйте команду chmod , чтобы сделать его исполняемым.

chmod +x files.sh

У нас есть несколько файлов в этом каталоге. У одного простое имя файла, а в двух других вместо пробелов используются знаки подчеркивания «_» или дефисы «-». Это то, что мы видим, когда запускаем скрипт.

./files.sh

Кажется, это работает хорошо. Но давайте заменим файлы в каталоге на файлы, имена которых содержат пробелы.

./files.sh

Каждое слово в каждом имени файла обрабатывается так, как если бы это было имя файла само по себе, поэтому сценарий не работает. Но все, что нам нужно сделать, чтобы скрипт обрабатывал пробелы в именах файлов, — это заключить в кавычки переменную $file внутри цикла for.

#!/bin/bash

file_list=*.txt

for file in $file_list
do
ls -hl "$file"
done

Обратите внимание, что знак доллара «$» находится внутри кавычек. Мы внесли это изменение и сохранили его в файле сценария «files.sh». На этот раз имена файлов обрабатываются правильно.

./files.sh

Растянутый, но не шелушащийся

Избегание пробелов в ваших собственных именах файлов приведет вас только к этому. Вы неизбежно столкнетесь с файлами из других источников с именами, содержащими пробелы. К счастью, если вам нужно обрабатывать эти файлы в командной строке или в сценариях, есть простые способы сделать это.

RELATED: Best Linux Laptops for Developers and Enthusiasts