Re: [問題] 讓每個檔案的修改時間差一秒

看板Linux作者 (小州)時間8年前 (2016/07/11 00:00), 8年前編輯推噓5(508)
留言13則, 7人參與, 最新討論串2/3 (看更多)
※ 引述《LIAR (玻璃做的大叔)》之銘言: : 我因為windows檔案管理的關係,有時要用檔名,有時要用時間排序, : 因此新檔案進來後我會先丟到linux裡面用touch調整時間。 : 現在我希望讓大量檔案的mtime只差一秒,我想過 : find *.mp4 -exec touch {} \; : mtime差距太短 : find *.mp4 -exec sleep 1 && touch {} \; : 語法執行錯誤,exec後面不能接 && 或是 ; 啊?? : 請問這種有辦法用bash辦到嗎? 首先要說你這個語法有個問題,記得要是: find -name "*.mp4" .... 你這樣語法是把 *.mp4 相展開了,系統當作目錄然後去找,意思差很多 而且是有問題的。另外正確一點: find -type f -name "*.mp4" 另外搭配指定某個目錄開始找: find /path -type f -name "*.mp4" 不要忘記 "*.mp4" 這個雙引號,因為萬用字元這時候是要給 find 看的, 若你沒包起來會給 shell 先解釋走了。 相隔一秒用 shell script 搭配一般工具似乎不是很方便好用, 可能外部命令呼叫太多次導致效率不號等,所以我幫你寫個簡單 python script #!/usr/bin/env python import time import sys import datetime import os from datetime import timedelta #current_datetime = datetime.datetime(2016,1,1,12,30,20) current_datetime = datetime.datetime.now() for item in sys.argv[1:]: current_datetime -= timedelta(seconds=1) result_datetime_unix_timestamp = int(current_datetime.strftime("%s")) try: os.utime(item,(result_datetime_unix_timestamp,result_datetime_unix_timestamp)) except: print("file access error: {}".format(item)) sys.exit(0) 把這段程式碼複製成為 xxxx.py 然後用 chmod a+x xxxx.py 即可使用。記得 python 是要求排版正確的程式語言,所以注意版面縮排等情況。 這段 code 可以把傳入參數的檔案列表把時間改成相隔一秒,不過因為一般不會考慮 把時間改成未來所以我改成過去,若你要改成未來只要改這段敘述: current_datetime -= timedelta(seconds=1) 預設是用 "-=" 改成 "+=" 即可。再來預設是取現在時間當基準點,若你要以某個 時間當基準,改一下: #current_datetime = datetime.datetime(2016,1,1,12,30,20) current_datetime = datetime.datetime.now() # 部分就是指定時間部分,下面那是取現在時間,上面取消註解改成所要的, 下面加上註解即可。 後續使用像是: ./xxxx.py *.jpg *.txt *.dat 或是 python xxx.py *.jpg *.txt *.dat 若你要搭配 find 使用也可以,但是記得程式是依據一堆清單才能夠相隔時間修改, 所以語法需要像是: find /path -type f -name "*.txt" -exec python xxxx.py {} + 注意要用 -exec ... {} + 這個語法,才會一次傳入一堆列表,若使用傳統 -exec {} \; 就會出問題,因為後者是一次帶入一個。 最後上面剛剛到 find 用法這樣呼叫其實還是一個很大的問題,因為一次帶入給 python 那個 xxxx.py 的檔案數量有限制的,一般系統好像是 3 萬多個吧?若是 帶入引數太多那個 python 會被重複呼叫,那時間又重新開始計算了..... 若你的檔案列表有超過這麼多那程式碼就需要重新改寫。 簡單改改: #!/usr/bin/env python import time import sys import datetime import os from datetime import timedelta #current_datetime = datetime.datetime(2016,1,1,12,30,20) current_datetime = datetime.datetime.now() try: file_handle = open(sys.argv[1]) except: print("Usage: {} filename".format(sys.argv[0])) sys.exit(1) for item in file_handle.readlines(): filename = item.strip("\n") current_datetime -= timedelta(seconds=1) result_datetime_unix_timestamp = int(current_datetime.strftime("%s")) try: os.utime(filename,(result_datetime_unix_timestamp,result_datetime_unix_timestamp)) except: print("file access error: {}".format(filename)) file_handle.close() sys.exit(0) 這個版本你就先這樣用: find /path -name "*.txt" > result.txt python xxxx.py result.txt 簡單說先找到清單,後續程式會開啟檔案清單列表的檔案內容來處理。 程式碼都簡單寫一下沒考慮太多,提供給你參考。 另外個人建議許多 linux 的朋友可以學學 python 這個程式語言, 很好用也非常優雅的工具,可以補足許多寫 shell script 時候需要 比較複雜的處理可以使用的好工具。 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 122.117.154.222 ※ 文章網址: https://www.ptt.cc/bbs/Linux/M.1468166414.A.6BE.html

07/11 00:17, , 1F
推薦文章。
07/11 00:17, 1F
謝謝指教。

07/11 00:25, , 2F
s/幽雅/優雅/
07/11 00:25, 2F
錯別字,哈哈,謝謝。 ※ 編輯: kenduest (122.117.154.222), 07/11/2016 00:26:29

07/11 00:54, , 3F
python真的不錯用
07/11 00:54, 3F
※ 編輯: kenduest (122.117.154.222), 07/11/2016 01:36:16

07/11 21:17, , 4F
python提供的語法彈性會讓寫這些東西輕鬆很多QQ
07/11 21:17, 4F

07/11 21:17, , 5F
不過像我自己不熟python,就是有時候直接拿nodejs當python
07/11 21:17, 5F

07/11 21:17, , 6F
在玩,拿nodejs去當shell的輔助工具
07/11 21:17, 6F

07/12 01:09, , 7F
我覺得Linux的人也要懂C
07/12 01:09, 7F

07/12 13:51, , 8F
c 個人倒是比較保守,一般來說不懂c影響不多
07/12 13:51, 8F

07/12 13:52, , 9F
不過可能看主要的需求吧,純管理應該是或許還不需要
07/12 13:52, 9F

07/12 13:52, , 10F
編譯 source code 部分不懂也沒差,懂好處大概是要改
07/12 13:52, 10F

07/12 13:52, , 11F
可能會簡單一點
07/12 13:52, 11F

07/12 19:55, , 12F
要不要懂就看做什麼事了...XD
07/12 19:55, 12F

07/17 09:48, , 13F
真的很感謝,我還沒學到python,我就不客氣收下了XD
07/17 09:48, 13F
文章代碼(AID): #1NWd4EQ- (Linux)
文章代碼(AID): #1NWd4EQ- (Linux)