Это серьезный вопрос. Я тестирую некоторые awk
скрипты и мне нужны файлы с новой строкой в их именах.
Можно ли добавить новую строку в имя файла с mv
?
Теперь я могу сделать это с touch
:
touch "foo
bar"
С прикосновением я добавил символ новой строки для каждой копии и вставки. Но я не могу написать foo
Returnbar
в своей оболочке.
Как я могу переименовать файл, чтобы иметь новую строку в имени файла?
Изменить 2015/06/28; 07:08
Чтобы добавить новую строку в zsh
я могу использовать, Alt+Return
mv
будет чем-то отличным от этогоtouch
? Вы пробовали то же самое?mv
команду так же легко, какtouch
.Ответы:
Это плохая идея (иметь странные символы в именах файлов), но вы могли бы сделать
(вы могли бы также сделать
mv somefile.txt "$(printf "foo\nbar")"
илиmv somefile.txt foo$'\n'bar
, и т. д. ... подробности специфичны для вашей оболочки. Я используюzsh
)Узнайте больше о globbing , например glob (7) . Детали могут быть специфичными для оболочки. Но поймите, что
/bin/mv
(с помощью вашей оболочки) через execve (2) предоставляется расширенный массив аргументов: расширение и глобализация аргументов является обязанностью вызывающей оболочки.И вы могли бы даже написать крошечную C-программу, чтобы сделать то же самое:
Сохраните указанную выше программу
foo.c
, скомпилируйте ее иgcc -Wall foo.c -o foo
запустите./foo
Аналогично, вы можете написать похожий скрипт на Perl, Ruby, Python, Ocaml и т. Д.
Но это плохая идея. Избегайте новых строк в именах файлов (это может сбить пользователя с толку, и это может нарушить многие сценарии).
На самом деле, я даже рекомендую использовать только не акцентированные буквы, цифры и
+-/._%
символы (с/
разделителем каталогов) в путях к файлам. «Скрытые» файлы (начиная с.
) следует использовать с осторожностью и осторожностью. Я считаю, что использование любого типа пробела в имени файла является ошибкой. Вместо этого используйте подчеркивание (напримерfoo/bar_bee1.txt
) или минус (напримерfoo/bar-bee1.txt
)источник
foo
.@
и,
будет более безобидным, чем-
(как в первой позиции) или%
. Все эти рекомендации предназначены главным образом для устранения ошибок в некоторых приложениях (которые нарушают имена файлов, которые в противном случае действительны с точки зрения ОС). Мне кажется обратным просить людей не использовать этих персонажей вместо того, чтобы исправлять их ошибки.Если вы используете bash, эта команда должна работать.
источник
zsh
=)Я знаю, что вы просили
mv
решение, однако, несмотря на предупреждение, это легко сделатьrename
(в пакете Perl):источник
rename
очень хорошую идею. +1Один аспект этой проблемы на самом деле не о
awk
- и только немного о оболочке. Проблема в том, что в стандартном, каноническом tty большую часть времени tty-дисциплина ядра буферизует ваш ввод - просто выводит его на экран и больше нигде - так, чтобы он мог эффективно обрабатывать возврат и тому подобное.Однако, когда вы нажимаете return или иным образом вводите новую строку, все эти буферизованные данные сразу передаются в приложение для чтения - обычно в вашу оболочку. Вы можете наблюдать это, наблюдая за
$PS2
введением висячей цитаты. Когда оболочка печатает,$PS2
это потому, что она просто читает какой-то блок вашего ввода и еще не убеждена, что вы прошли.Итак, для удобства вам нужен какой-то способ отправки
\n
ewline в буфер терминала без необходимости немедленной отправки всех этих других входных данных. Стандартный способ сделать это - w / последовательность клавишCTRL+V
- которая указывает на терминал ваш следующий вводимый символ. СделайтеCTRL+V
тогдаCTRL+J
- потому что последнее обычно, как печатать буквальный\n
ewline. Вы будете знать, что это работает, когда вы не видите,$PS2
потому что оболочка все еще не прочитала ваш ввод.Обратите внимание , однако , что , когда он действительно читал , что ваш вход раньше
CTRL+V
не будет никакой разницы для оболочки вообще - что только цитирует его линию дисциплины. Вы определенно захотите заключить в кавычки новую строку, чтобы сделать с ней что-нибудь значимое.Кстати,
CTRL+V
может быть с пользой применен другими способами - например,"$(printf \\33)"
это не единственный способ записатьESC
символ в сценарий оболочки - и он даже не самый простой. Вы можете буквально ввести любой символ, который будет отправлять ваша клавиатура, без попытки драйвера ввода интерпретировать его, если вы просто экранируете его таким образом.Мне часто нравится использовать <tab> в командной строке, а оболочка не пытается что-либо завершить. Поскольку оболочки, выполняющие завершение, обычно настраивают <tab> таким образом
stty eol \t
, чтобы их системы завершения работали, этоCTRL+V
работает для меня даже в незнакомой среде.источник