※ 引述《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 時候需要
比較複雜的處理可以使用的好工具。