Это не строго ответ на вопрос, но во многих случаях может сделать это ненужным:
При первом запуске оболочки запустите set -o ignoreeof
. Не кладите его в ~/.bashrc
.
Сделайте привычкой нажимать Ctrl -D, когда вы думаете, что находитесь в оболочке верхнего уровня и хотите быть уверенным.
Если вы не находитесь в оболочке верхнего уровня, Ctrl -D будет означать «конец ввода» для текущей оболочки, и вы вернетесь на один уровень назад.
Если вы находитесь в оболочке верхнего уровня,вы получите сообщение:
Use "logout" to leave the shell.
Я использую это все время для связанных сеансов SSH, чтобы упростить возврат к определенному уровню цепочки SSH. Это работает и для вложенных оболочек.
Чтобы перебрать все файлы в текущем каталоге, которые содержат хотя бы один символ :
в своем имени и заканчиваются на .txt
, и заменить символы :
на _
, с помощью ksh93, zsh, оболочки bash, mksh (или последние версии busybox sh ), вы можете использовать
for name in./*:*.txt; do
newname=${name//:/_}
mv -i "$name" "$newname"
done
или, короче,
for name in./*:*.txt; do
mv -i "$name" "${name//:/_}"
done
Подстановка параметра ${name//:/_}
изменит все :
на _
в любом месте значения$name
(оператора ksh93, также поддерживаемого упомянутыми выше оболочками ).
mv -i
переименует файл, но запросит подтверждение, если новое имя уже занято.
Имя файла, показанное в качестве примера, будет изменено на ee_Sun_Aug_11_22_20_27_GMT-8_2019.txt
.
Ваша команда
cp /var/log/ee.txt ee_`date`.txt
не работает, потому что date
выводит строку с пробелами. Пробелы заставили бы cp
подумать, что вы хотите скопировать несколько файлов в каталог. Следовательно, ошибка «не является каталогом».
Следующее сработало бы лучше:
cp /var/log/ee.txt "ee_$(date).txt"
Это работает лучше не потому, что я изменил ваши обратные кавычки на $(...)
, а потому, что я дважды -процитировал новое имя.
Это создало бы файлee_Sun Aug 11 16:57:37 CEST 2019.txt
(или что-то подобное ).
Чтобы получить более аккуратное имя файла, вы можете указать формат вывода для date
более точно:
cp ee.txt "ee_$(date +"%F_%H-%M-%S").txt"
Строка формата %F_%H-%M-%S
будет описана в руководстве strftime(3)
по вашей системе(man 3 strftime
)или в руководстве по команде date
, и вы получите имя файла, подобное ee_2019-08-11_16-59-55.txt
. Если ваш date
не поддерживает директиву %F
, вы можете заменить ее на %Y-%m-%d
.
Как вариант,
cp ee.txt "$(date +"ee_%F_%H-%M-%S.txt")"
(позволяя формату команды date
выполнять большую часть работы по созданию нового имени файла)