User Tools

Site Tools


bash:спецсимволы_в_именах

Bash Управление файлами содержащих спецсимволы в именах

Имена файлов

Пример наиболее распространенных имен файлов:

abc.txt
avi.txt
debian.txt
 
# Пример имен содержащих числа
121.txt
3221.txt
674659.txt
 
# буквенно-цифровые
eg84235.txt
3kf43nl2.txt
2323ddw.txt

Также, менее распространенные, но все же встречающиеся файла, содержащие спец символы в имени:

#232.txt
#bkf.txt
#bjsd3469.txt
#121nkfd.txt
-2232.txt
-fbjdew.txt
-gi32kj.txt
--321.txt
--bk34.txt

Имена содержащие тире ( - )

Есть два способа создать имя файла содержащие <html>-</html>

touch -- -abc.txt
 
# or		
touch ./-abc.txt

Чтобы переименовать такой файл используем такую конструкцию

mv -- -abc.txt -a.txt

А для удаления, такую:

rm -- -abc.txt
 
# or
rm ./-abc.txt 

Если есть несколько файлов, содержащих тире, которые нужно удалить, выполним:

rm ./-*

Одна важная вещь, на которую стоит обратить внимание в примере выше, под действие команды удаления попадут все файлы содержащие тире. Не только в начале, а в любой части мени. А именно, <html>-abc.txt</html>, <html>ab-c.txt</html>, <html>abc-.txt</html> и т. д.

Имена содержащие hash (#)

Известно, что символ <html>#</html>, интерпретируется в dash как комментарий. А следовательно игнорируется. При попытке создать такой файл, получим:

touch #hash-name.file
 
touch: missing file operand
Try 'touch --help' for more information.

Bash интерпретирует комментарий <html>#abc.txt</html> и, следовательно, игнорирует его. Таким образом, команда touch была передана без какого-либо файлового операнда, и следовательно, ошибка.

Для устранить такую ​​ошибку, вы можете попросить BASH не интерпретировать <html>#</html> как комментарий:

touch ./#abc.txt
# or
touch '#abc.txt'

Если попробовать создать сразу несколько файлов:

touch a.txt #bc.txt

То будет создан только один – <html>a.txt</html>, <html>#bc.txt</html> был проигнорирован, но при этом, без сообщения об ошибке. Для группового создания файлов с такими именами, действуем таким образом:

touch a.txt ./#bc.txt
# or
touch a.txt '#bc.txt'

Стандартные файловые операции:

# Перемещение
mv ./#bc.txt ./#cd.txt
# or
mv '#bc.txt' '#cd.txt'
 
# Копирование
cp ./#cd.txt ./#de.txt
# or
cp '#cd.txt' '#de.txt'
 
# Удаление
rm ./#bc.txt 
# or
rm '#bc.txt'
# Чтобы удалить все файлы с решеткой
rm ./#*

Имена содержащие точку с запятой ( ; )

В bash, точка с запятой, действует как разделитель, позволяя выполнять несколько команд за один раз. Если попробуем создайте имя файла начинающиеся с <html>;</html>, получим вот такое сообщение:

touch ;abc.txt
 
touch: missing file operand
Try 'touch --help' for more information.
abc.txt: command not found

Причина вышеуказанной ошибки заключается в том, что bash интерпретирует touch как команду, но не может найти ни одного файлового операнда перед точкой с запятой и следовательно, сообщает об ошибке. bash также сообщает о другой ошибке, что команда <html>abc.txt</html> не найдена, только потому, что после точки с запятой bash ожидал другую команду, а <html>abc.txt</html> которая не является командой.

Чтобы устранить эту ​​ошибку, укажем bash, не интерпретировать точку с запятой как разделитель команд:

touch ./';abc.txt'
# or
touch ';abc.txt'

Имя файла заключенное в одинарные кавычки <html>''</html>, сообщает bash, что <html>;</html> это часть имени файла, а не разделитель команд.

Другие специальные символы в имени файла/директории

Знак плюс ( + ) в имени файла

Не требует никаких дополнительных телодвижений.

touch +2308.txt 

Знак доллар ( $ ) в имени файла

Следует заключить имя файла в одинарные кавычки, как это ранее делали в случае с точкой с запятой:

touch '$2308.txt'

Asterisk ( * ) в имени файла

Наличие asterisk-а в имени файла ничего не меняет, работаем как с обычным файлом:

touch *2308.txt

Но, есть нюансы. Когда будет нужно удалить файл, который начинается с <html>*</html>, никогда не используем следующею команду:

rm *
# or
rm -rf *

Удаляем таким образом:

rm ./*.txt

Процент ( % ) в имени файла

Ничего дополнительного делать не нужно:

touch %2308.txt

Восклицательный знак ( ! ) в имени файла

заключаем имя файла в одинарные кавычки:

touch '!2308.txt'

Сaret ( ^ ) в имени файла

Nothing to do

touch ^2308.txt

Амперсанд ( & ) в имени файла

одинарные кавычки:

touch '&2308.txt'

Скобки ( ) в имени файла

одинарные кавычки: touch '(2308.txt)'

Фигурные скобки { } в имени файла

Дополнительного полива не требуют

touch {2308.txt}

Шевроны < > в имени файла

Одинарные кавычки:

touch '<2308.txt>'

Квадратные скобки [ ] в имени файла

Этим ребятам ничего не нужно:

touch [2308.txt]

Подчеркивание ( _ ) в имени файла

touch _2308.txt

Равно ( = ) в имени файла

touch =2308.txt

back slash ( \ ) в имени файла

back slash указывает оболочке игнорировать следующий символ. В одинарные кавычке

touch '\abc.txt'

Вопросительный знак ( ? ) в имени файла

touch ?2308.txt

Точка ( . ) в имени файла

в Linux, файлы, начинающиеся с точки <html>.</html>, являются особенными и называются dot-файлами. Это скрытые файлы, как правило, конфигурационные или системные файлы. Для просмотра таких файлов необходимо использовать флаг <html>-a</html> или <html>-A</html> в команде ls.

Создание такого файла ничем не примечательна:

touch .2308.txt

В Linux, в имени файла может быть столько точек, сколько необходимо. В отличие от других OS, точка в имени файла не является разделителем имени и расширения:

touch 1.2.3.4.5.6.7.8.9.10.txt

Запятая ( , ) в имени файла

touch ,12.txt
# or
touch ,12,.txt

Двоеточие ( : ) в имени файла

touch :12.txt
# or
touch :12:.txt

Кавычки (одинарные и двойные) в имени файла

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

touch "15'.txt"
# and
touch '15”.txt'

Тильда ( ~ ) в имени файла

touch ~1a.txt
# or
touch 2b~.txt

Пробел в имени файла

touch hi\ my\ name\ is\ nevvad.txt
touch 'hi my name is nevvad2.txt'
bash/спецсимволы_в_именах.txt · Last modified: 2023/04/06 10:18 (external edit)