Dołączanie bieżącej daty ze zmiennej do nazwy pliku

55

Próbuję dołączyć bieżącą datę na końcu nazwy pliku w następujący sposób:

TheFile.log.2012-02-11

Oto co mam do tej pory:

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

Jednak dostaję tylko nazwę pliku i nic nie dodaje. Jak dodać aktualną datę do nazwy pliku?

JESTEM L.
źródło
kiedy aprobujesz datę, pamiętaj, aby jej nie używać, :ponieważ wtedy będzie ona czytana jako host w rsync i scp. stackoverflow.com/a/37143274/390066
kirill_igum

Odpowiedzi:

78

Bardziej niż prawdopodobne jest to twoje wykorzystanie set. Spowoduje to przypisanie „dzisiaj”, „=” i wyniku dateprogramu do parametrów pozycyjnych (czyli argumentów wiersza poleceń). Chcesz po prostu użyć powłoki C (która oznacza to jako „bash”, więc prawdopodobnie nie), będziesz chciał użyć:

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

Zwróć uwagę na brak spacji wokół znaku równości.

Nie chcesz również używać &na końcu swoich wyciągów; co powoduje, że powłoka nie czeka na zakończenie polecenia. Zwłaszcza, gdy ktoś polega na drugim. findKomenda może nie dlatego, że jest uruchomiony przed mkdir.

Arcege
źródło
Dzięki za partnera, teraz działa 100% grzywny, Pozdrowienia dla heads-upa i mkdir
I AM L
55

Skrypt Bash, aby wstawić datę do nazwy pliku:

Ten kod bash w pliku o nazwie a.sh

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

Po uruchomieniu drukuje:

eric@dev ~ $ chmod +x a.sh

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

Objaśnienie kodu:

Interpretuj skrypt za pomocą interpretera / bin / bash. Utwórz nową zmienną o nazwie dzisiaj. Wykonaj polecenie date, przekazując flagi Y, m, d, H, M, S, aby skonfigurować dane wyjściowe. Umieść wynik w zmiennej daty.

Utwórz nową zmienną o nazwie nazwa_pliku, otaczaj zmienną $ Today resztą tekstu statycznej nazwy pliku. następnie powtórz nazwę pliku na ekranie.

Wciśnij go w linijkę, aby zwiększyć lulz:

echo "/home/el/myfile/`date '+%Y_%m_%d__%H_%M_%S'`.ponies"
Eric Leschinski
źródło
5

Wygląda na to, że pomieszałeś kilka rzeczy.

set today = 'date +%Y'wygląda na składnię tcsh, ale nawet w tcsh przypisuje ciąg date +%Ydo zmiennej today, nie uruchamia datepolecenia. Ponieważ prawdopodobnie używasz bash lub innej powłoki POSIX, składnia przypisania jest następująca today=some_value(bez spacji wokół znaku równości). Aby uruchomić polecenie i przypisać dane wyjściowe do zmiennej, użyj podstawienia polecenia :

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

(Skończyłem także specyfikację daty). Możesz używać cudzysłowów zamiast nawiasów dolarowych, ale jest podatny na mylące wizualnie z cudzysłowami do przodu, a zasady, kiedy potrzebujesz cudzysłowów wewnątrz polecenia z cudzysłowem, są dość złożone i zależą od implementacji, więc lepiej nie trzymać się $(…)( ma taki sam efekt ze składnią sanera).

Użyłeś &na końcu kilku poleceń. To powoduje, że polecenie wykonuje się w tle, co nie jest tutaj potrzebne. Podejrzewam, że miałeś na myśli &&, co oznacza wykonanie następnego polecenia tylko wtedy, gdy pierwsze polecenie się powiedzie.

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

Alternatywą do używania &&po każdym poleceniu jest uruchomienie skryptu set -e. To mówi powłoce, aby przestała wykonywać skrypt, gdy tylko dowolne polecenie zwróci niezerowy status (z wyjątkiem poleceń w ifwarunkach i kilku innych przypadkach).

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

Twoje findpolecenie jest w porządku, ale prawdopodobnie nie robi tego, co zamierzasz (chociaż nie wiem na pewno, co to jest).

Tworzysz katalog za pomocą, mkdira następnie od razu go przeglądasz find. To nie będzie przydatne, dopóki katalog już nie istnieje. Czy chodziło Ci o utworzenie katalogu dla dzisiejszych dzienników i przeniesienie ostatnich plików The_Logsdo katalogu o nazwie np. The_Logs.2012-02-11?

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

A może chciałeś zmienić nazwę dzisiejszych plików dziennika, aby dodać przyrostek $today? Wymaga to obliczenia innej nazwy pliku dla każdego pliku do przeniesienia.

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

Zauważ, że użyłem -mtime, aby przenieść pliki na podstawie ich czasu modyfikacji, a nie -atime, czyli czasu ostatniego odczytu pliku (jeśli twój system to śledzi - jeśli nie, atime może być tak daleko jak mtime).

Gilles „SO- przestań być zły”
źródło
3

Możesz zmienić nazwę pliku z dołączonym znacznikiem czasu

mv TheFile.log TheFile.log.`date +"%d-%m-%Y"`
Atul Rokade
źródło
2

To:

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

powinno działać. Chociaż wydaje się, że używasz csh, a moje rozwiązanie polegające na usunięciu znaku + może nie działać, ale nie zaszkodzi spróbować. Umieszczenie zmiennej w nawiasach klamrowych {{} zawsze jest dobrym pomysłem, aby zapobiec nieoczekiwanemu rozwinięciu zmiennej.

MelBurslan
źródło
Dzięki kolego, po dodaniu poprawki z drugą odpowiedzią, działa dobrze.
JESTEM L