看板 Linux 關於我們 聯絡資訊
※ 引述《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
Debian: 推薦文章。 07/11 00:17
謝謝指教。
s25g5d4: s/幽雅/優雅/ 07/11 00:25
錯別字,哈哈,謝謝。 ※ 編輯: kenduest (122.117.154.222), 07/11/2016 00:26:29
Bellkna: python真的不錯用 07/11 00:54
※ 編輯: kenduest (122.117.154.222), 07/11/2016 01:36:16
Hevak: python提供的語法彈性會讓寫這些東西輕鬆很多QQ 07/11 21:17
Hevak: 不過像我自己不熟python,就是有時候直接拿nodejs當python 07/11 21:17
Hevak: 在玩,拿nodejs去當shell的輔助工具 07/11 21:17
kenwufederer: 我覺得Linux的人也要懂C 07/12 01:09
kenduest: c 個人倒是比較保守,一般來說不懂c影響不多 07/12 13:51
kenduest: 不過可能看主要的需求吧,純管理應該是或許還不需要 07/12 13:52
kenduest: 編譯 source code 部分不懂也沒差,懂好處大概是要改 07/12 13:52
kenduest: 可能會簡單一點 07/12 13:52
Hevak: 要不要懂就看做什麼事了...XD 07/12 19:55
LIAR: 真的很感謝,我還沒學到python,我就不客氣收下了XD 07/17 09:48