2011-11-22 354 views
51

好吧,我是一個linux新手,我遇到了一個簡單的bash腳本問題。將時間戳記添加到BASH中的mv文件名

我有一個程序在運行時添加到日誌文件中。隨着時間的推移,日誌文件變得巨大我想創建一個啓動腳本,它將在每次運行之前重命名並移動日誌文件,從而有效地爲程序的每次運行創建單獨的日誌文件。下面是我到目前爲止有:

pastebin

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

在運行的時候,我看到:

: command not found 
program 

當我cd到日誌目錄並運行目錄,我看到這一點:

201111211437\r.log\r 

發生了什麼事?我假設我缺少一些語法問題,但我似乎無法弄清楚。


UPDATE:感謝shellter下面的評論中,我發現這個問題是由於我正在編輯在記事本++的sh文件中的窗口,然後通過FTP發送到服務器的事實,我通過ssh運行該文件。在文件上運行dos2unix後,它可以正常工作。

新問題:如何在第一時間正確保存文件,以避免每次重新發送文件時都必須執行此修復?

+2

'\ r'是carriage_return,檢查你的bash腳本,可能包含腳本 – ajreal

+0

內回車從哪裏來?我猜''logs/$ DATE.log'是錯誤的,但是輸入'echo logs/$ DATE.log'會輸出正確的路徑。 – Cat5InTheCradle

+0

我怎麼知道?請附上相應的bash腳本,可能有不明顯的whitepspaces – ajreal

回答

19

你從腳本發佈的幾行看起來對我來說還好。這可能會更深一層。

你需要找到哪條線給你這個錯誤。將set -xv添加到腳本的頂部。這會將行號和正在執行的命令打印到STDERR。這將幫助您識別腳本中的哪個位置出現此特定錯誤。

順便說一句,你的腳本的頂部是否有shebang?當我看到這樣的事情時,我通常會期待它與Shebang有關的問題。例如,如果頂部有#! /bin/bash,但您的bash解釋器位於/usr/bin/bash,則會看到此錯誤。

編輯

新的問題:如何正確保存的文件擺在首位,以避免執行此修復每次我重新發送該文件的時間?

兩種方式:

  1. 選擇編輯 - >當你編輯一個文件EOL轉換 - > UNIX格式菜單項。一旦它有正確的行結束符,Notepad ++將保留它們。
  2. 要確保所有新文件都具有正確的行結尾,請轉到設置 - >首選項菜單項,並拉出首選項對話框。選擇新文檔/默認目錄選項卡。 新文檔格式,選擇Unix單選按鈕。點擊關閉按鈕。
+0

我會看看我是否可以嘗試。運行dos2unix一旦ftp到我的linux服務器解決了這個問題,但我正在尋找一種解決方案來解決這個問題。我在開始時沒有一個shebang,這可能是關鍵。 – Cat5InTheCradle

+1

@AgentSnazz - 啊哈!那就是問題所在。 Unix shell腳本必須具有Unix行結束符。 Windows/MS-DOS使用回車換行符(又名CRLF或\ r \ n)來標記行的結尾。 Unix只使用換行符(又名LF或\ n)。如果您在Windows計算機上編輯Unix文件,則必須使用可執行正確行結束的程序編輯器(如[Vim](http://www.vim.org)或[Notepad ++](http:/ /notepad-plus-plus.org/)**不要使用記事本**,這就是爲什麼你在文件名中看到'\ r'的原因,每行末尾都有一個不可見的'\ r'在你的程序中 –

+0

@AgentSnazz - 看看我的答案編輯。 –

4

嗯,它不是直接回答你的問題,但是GNU/Linux中有一個工具,它的工作是定期輪換日誌文件,將舊文件壓縮到一定限度。它是logrotate

+0

我會看看,我喜歡我的方法,因爲它很好地將程序的每次運行都包裝在自己的日誌文件中。 – Cat5InTheCradle

46
mv server.log logs/$(date -d "today" +"%Y%m%d%H%M").log 
+11

'date +「%Y%m%d%H%M」'如果你的bash有點不同 – zinking

+2

要強調@ zinking的觀點,必須**不是**加號和雙引號之間的空格 – puk

0

你可以寫在記事本中的腳本,但只要確保你使用它們轉換 本 - > $ SED -i 'S/\ r $ //' yourscripthere

我用它所有他們的時間當我在cygwin工作,它的工作原理。希望這可以幫助

2

bash中的單行方法就像這樣工作。

[一些出放]> $(日期 「+%Y.%米。%D-%H.%M.%S」)。版本

將創建與版本的時間戳名稱的文件延期。 工作文件列出了快照到日期標記文件名稱如下,可以顯示它工作。

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

當然

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

或者也可以簡單

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