Dodanie znacznika czasu do nazwy pliku za pomocą mv w BASH

85

Cóż, jestem nowicjuszem w Linuksie i mam problem z prostym skryptem basha.

Mam program, który dodaje do pliku dziennika, gdy jest uruchomiony. Z biegiem czasu ten plik dziennika staje się ogromny. Chciałbym utworzyć skrypt startowy, który zmieni nazwę i przeniesie plik dziennika przed każdym uruchomieniem, skutecznie tworząc oddzielne pliki dziennika dla każdego uruchomienia programu. Oto, co mam do tej pory:

pastebin

DATE=$(date +"%Y%m%d%H%M")
mv server.log logs/$DATE.log
echo program

Po uruchomieniu widzę to:

: command not found
program

Kiedy przechodzę do katalogu logs i uruchamiam dir, widzę to:

201111211437\r.log\r

Co się dzieje? Zakładam, że brakuje mi jakiegoś problemu ze składnią, ale nie mogę tego rozgryźć.


AKTUALIZACJA: Dzięki komentarzowi shelltera poniżej stwierdziłem, że problem polega na tym, że edytuję plik .sh w Notepad ++ w systemie Windows, a następnie wysyłam przez ftp na serwer, gdzie uruchamiam plik przez ssh . Po uruchomieniu dos2unix na pliku działa.

Nowe pytanie: Jak przede wszystkim poprawnie zapisać plik, aby uniknąć konieczności wykonywania tej poprawki za każdym razem, gdy ponownie wysyłam plik?

Cat5InTheCradle
źródło
2
\rjest
powrót_wozu
Skąd miałby pochodzić ten powrót powozu? Domyślam się, że coś logs/$DATE.logjest nie tak, ale wpisanie powoduje echo logs/$DATE.logwyświetlenie poprawnej ścieżki.
Cat5InTheCradle
skąd mam wiedzieć proszę załączyć odpowiedni skrypt basha, prawdopodobnie są niezauważalne białe przestrzenie
ajreal 22.11.11
Dodano łącze wklejane do głównego postu, ale ten fragment kodu to dosłownie cały skrypt, właśnie zastąpiłem „program echo” wierszem, który uruchamia java .jar
Cat5InTheCradle
brak pomysłu ... wydaje się być poprawny, a może spróbujesz dołączyć jakieś ciągi po DATE=$(date +"%Y%m%d%H%M")?
ajreal

Odpowiedzi:

24

Kilka wierszy, które opublikowałeś ze swojego skryptu, wygląda dla mnie w porządku. To prawdopodobnie coś głębszego.

Musisz dowiedzieć się, która linia powoduje ten błąd. Dodaj set -xvna początku swojego skryptu. Spowoduje to wydrukowanie numeru linii i polecenia, które jest wykonywane w STDERR . Pomoże ci to zidentyfikować, gdzie w skrypcie pojawia się ten konkretny błąd.

A tak przy okazji, czy masz shebang na początku swojego scenariusza? Kiedy widzę coś takiego, zwykle spodziewam się, że to problem z Shebangiem. Na przykład, jeśli masz #! /bin/bashna górze, ale twój interpreter bash znajduje się w/usr/bin/bash , zobaczysz ten błąd.

EDYTOWAĆ

Nowe pytanie: Jak przede wszystkim poprawnie zapisać plik, aby uniknąć konieczności wykonywania tej poprawki za każdym razem, gdy ponownie wysyłam plik?

Dwie drogi:

  1. Wybierz Edit-> EOL Conversion-> Unix Format kiedy edytujesz plik. Gdy ma prawidłowe zakończenia linii, Notepad ++ zachowa je.
  2. Aby upewnić się, że wszystkie nowe pliki mają poprawne zakończenia linii, przejdź do pozycji menu Ustawienia-> Preferencje i otwórz okno dialogowe Preferencje . Wybierz kartę Nowy dokument / Katalog domyślny . W obszarze Nowy dokument i format wybierz przycisk opcji Unix . Kliknij przycisk Zamknij .
David W.
źródło
Zobaczę, czy mogę tego spróbować. Uruchomienie dos2unix po przesłaniu pliku na serwer linuxowy rozwiązuje problem, ale szukam sposobu obejścia tego dodatkowego kroku. Na początku nie mam shebangu, to może być klucz.
Cat5InTheCradle
2
@AgentSnazz - Ah ha! To jest problem. Skrypty powłoki Unix muszą mieć końcówki linii w systemie Unix. Windows / MS-DOS używa znaku powrotu karetki (aka CRLF lub \ r \ n) do oznaczenia końca linii. Unix używa tylko wysuwu wiersza (aka LF lub \ n). Jeśli edytujesz plik dla Uniksa na komputerze z systemem Windows, musisz użyć edytora programów, który potrafi wykonać poprawne zakończenia linii (np. Vim lub Notepad ++ . Nigdy nie używaj Notatnika . Dlatego \rw nazwie pliku widzisz znak) . Na \rkońcu każdego wiersza w twoim programie znajduje się niewidoczny
David W.,
82
mv server.log logs/$(date -d "today" +"%Y%m%d%H%M").log
dqw
źródło
16
date +"%Y%m%d%H%M"jeśli twoje bash jest trochę inne
zinking
6
Na stres @ punktu zinking użytkownika, musi nie być przestrzeń pomiędzy plusa i cudzysłowy
PUK
9

Metoda pojedynczej linii w bashu działa w ten sposób.

[jakieś wyjście]> $ (data "+% Y.% m.% d-% H.% M.% S"). wer

utworzy plik z nazwą znacznika czasu z rozszerzeniem ver. Plik roboczy zawierający migawki z nazwą pliku z datownikiem w następujący sposób może pokazać, że działa.

find . -type f -exec ls -la {} \; | cut -d ' ' -f 6- >$(date "+%Y.%m.%d-%H.%M.%S").ver

Oczywiście

cat somefile.log > $(date "+%Y.%m.%d-%H.%M.%S").ver

lub nawet prostsze

ls > $(date "+%Y.%m.%d-%H.%M.%S").ver

Cyberience
źródło
5

Używam tego polecenia do prostego obracania pliku:

mv output.log `date +%F`-output.log

W folderze lokalnym mam 2019-09-25-output.log

alfiogang
źródło
4

Cóż, nie jest to bezpośrednia odpowiedź na twoje pytanie, ale w systemie GNU / Linux jest narzędzie, którego zadaniem jest regularna rotacja plików dziennika, utrzymywanie starych spakowanych do pewnego limitu. Jegologrotate

Didier Trosset
źródło
Popatrzę na to, podoba mi się moja metoda, ponieważ ładnie opakowuje każde uruchomienie programu w swoim własnym pliku dziennika.
Cat5InTheCradle
1

Możesz pisać swoje skrypty w notatniku, ale upewnij się, że przekonwertujesz je za pomocą tego -> $ sed -i 's / \ r $ //' yourscripthere

Używam go cały czas, kiedy pracuję w Cygwin i to działa. Mam nadzieję że to pomoże

mkrouse
źródło