Как изменить имя файла, содержащее ":" в информации о времени

Это не строго ответ на вопрос, но во многих случаях может сделать это ненужным:

При первом запуске оболочки запустите set -o ignoreeof. Не кладите его в ~/.bashrc.

Сделайте привычкой нажимать Ctrl -D, когда вы думаете, что находитесь в оболочке верхнего уровня и хотите быть уверенным.

Если вы не находитесь в оболочке верхнего уровня, Ctrl -D будет означать «конец ввода» для текущей оболочки, и вы вернетесь на один уровень назад.

Если вы находитесь в оболочке верхнего уровня,вы получите сообщение:

Use "logout" to leave the shell.

Я использую это все время для связанных сеансов SSH, чтобы упростить возврат к определенному уровню цепочки SSH. Это работает и для вложенных оболочек.

2
11.08.2019, 17:47
1 ответ

Чтобы перебрать все файлы в текущем каталоге, которые содержат хотя бы один символ :в своем имени и заканчиваются на .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выполнять большую часть работы по созданию нового имени файла)

6
27.01.2020, 21:53

Теги

Похожие вопросы