Додавання поточної дати від змінної до імені файлу


55

Я намагаюся додати поточну дату до кінця імені файлу так:

TheFile.log.2012-02-11

Ось що я маю досі:

set today = 'date +%Y'
mkdir -p The_Logs &
find . -name The_Logs -atime -1 -type d -exec mv \{} "The_Logs_+$today" \; &

Однак все, що я отримую, - це ім'я файлу, і він нічого не додає. Як додати поточну дату до імені файлу?


коли ви додаєте дату, переконайтеся, що не використовувати, :оскільки тоді вона буде прочитана як хост у rsync та scp. stackoverflow.com/a/37143274/390066
kirill_igum

Відповіді:


78

Більш ніж ймовірно, це ваше використання set. Це призначить 'сьогодні', '=' та вихід dateпрограми для позиційних параметрів (також аргументів командного рядка). Ви хочете просто використовувати оболонку C (яку ви позначите як "bash", так що, швидше за все, не потрібно), ви хочете використовувати:

today=`date +%Y-%m-%d.%H:%M:%S` # or whatever pattern you desire

Зауважте відсутність пробілів навколо знака рівності.

Ви також не хочете використовувати &в кінці своїх заяв; що змушує оболонку не чекати, коли команда закінчиться. Особливо, коли один спирається на наступний. findКоманда може не тому , що він був запущений перед mkdir.


Дякую за того товариша, його робочий% 100 штрафу зараз, Ура за голову & та mkdir
Я L L

55

Сценарій Bash для введення дати в ім’я файлу:

Цей bash-код у файлі називається a.sh

#!/bin/bash
today=`date '+%Y_%m_%d__%H_%M_%S'`;
filename="/home/el/myfile/$today.ponies"
echo $filename;

Під час запуску друкує:

eric@dev ~ $ chmod +x a.sh

eric@dev ~ $ ./a.sh
/home/el/myfile/2014_08_11__15_55_25.ponies

Пояснення коду:

Інтерпретуйте сценарій за допомогою інтерпретатора / bin / bash. Створіть нову змінну, яку називають сьогодні. Виконайте команду дати, передавши прапори Y, m, d, H, M, S для налаштування виводу. Помістіть результат у змінну дати.

Створіть нову змінну під назвою ім'я файлу, оточіть змінну $ сьогодні з рештою тексту статичного імені файлу. потім відлучіть ім'я файлу на екран.

Затисніть його на одноклавішну, щоб збільшити лулз:

echo "/home/el/myfile/`date '+%Y_%m_%d__%H_%M_%S'`.ponies"

5

Ви ніби змішали кілька речей.

set today = 'date +%Y'виглядає як синтаксис tcsh, але навіть у tcsh він призначає рядок date +%Yзмінній today, вона не виконує dateкоманду. Оскільки ви, ймовірно, використовуєте bash або іншу оболонку POSIX, синтаксис призначення є today=some_value(без пробілів навколо знака рівності). Щоб запустити команду та призначити її вихід змінній, використовуйте підстановку команди :

today=$(date +%Y-%m-%d)

(Я також завершив специфікацію дати). Ви можете використовувати зворотні котирування замість дужок долара, але це схильне до того, щоб візуально плутати з котируваннями вперед, а правила, коли вам потрібні лапки всередині команди, що коментується, досить складні і залежать від реалізації, тому краще не дотримуватися $(…)(які має той самий ефект із синтаксисом saner).

Ви використовували &в кінці кілька команд. Це змушує команду виконуватись у фоновому режимі, чого тут не потрібно. Я підозрюю, що ви мали на увазі &&, що означає виконати наступну команду, лише якщо перша команда вдалася.

today=$(date +%Y-%m-%d)
mkdir -p The_Logs &&
find 

Альтернативою для використання &&після кожної команди є запуск сценарію set -e. Це сповіщає оболонку припинити виконання сценарію, як тільки будь-яка команда поверне ненульовий статус (за винятком команд в ifумовах та кількох інших випадках).

set -e
today=$(date +%Y-%m-%d)
mkdir -p The_Logs
find 

Ваша findкоманда в порядку, але, ймовірно, не робить того, що ви маєте намір робити (хоча я точно не знаю, що це таке).

Ви створюєте каталог із, mkdirа потім негайно переходите до нього find. Це не буде корисно, якщо каталог вже не існує. Ви мали на увазі створити каталог для журналів сьогодні та перемістити останні файли з The_Logsкаталогу, наприклад The_Logs.2012-02-11,?

mkdir -p "The_Logs.$today"
find The_Logs -mtime -1 -exec mv {} "The_Logs.$today" \;

Або ви мали намір перейменувати сьогоднішні файли журналу, щоб додати суфікс $today? Для цього потрібно обчислити різну назву файлу для кожного файлу для переміщення.

find The_Logs -mtime -1 -exec sh -c 'mv "$0" "$0.$today"' {} \;

Зауважте, що я використовував -mtimeдля переміщення файлів на основі часу їх модифікації, а не -atimeв цей час, коли файл останній раз читався (якщо ваша система це відслідковує - якщо цього не відбувається, atime може бути назад, як mtime).


3

Ви можете перейменувати файл із доданою до нього позначкою часу

mv TheFile.log TheFile.log.`date +"%d-%m-%Y"`

2

Це:

find . -name The_Logs -atime -1 -type d -exec mv {} "The_Logs_${today}" \; &

повинні працювати. Хоча, здається, ви використовуєте csh, і моє рішення про видалення знака + може не працювати для вас, але спробувати не завадить. Закриття змінної у {} фігурних дужках - це завжди хороша ідея, щоб запобігти несподіваним розширенням змінних.


Спасибі, товариш, після додавання вашої корекції до іншої відповіді, це працює добре.
Я L
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.