讓每個檔案的修改時間差一秒 - Linux

Caroline avatar
By Caroline
at 2016-07-11T00:00

Table of Contents

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

--
Tags: Linux

All Comments

Ida avatar
By Ida
at 2016-07-14T23:44
推薦文章。
Kelly avatar
By Kelly
at 2016-07-15T19:04
s/幽雅/優雅/
Rachel avatar
By Rachel
at 2016-07-20T07:57
python真的不錯用
Tracy avatar
By Tracy
at 2016-07-20T12:10
python提供的語法彈性會讓寫這些東西輕鬆很多QQ
不過像我自己不熟python,就是有時候直接拿nodejs當python
在玩,拿nodejs去當shell的輔助工具
Elma avatar
By Elma
at 2016-07-24T20:12
我覺得Linux的人也要懂C
Regina avatar
By Regina
at 2016-07-26T07:06
c 個人倒是比較保守,一般來說不懂c影響不多
Annie avatar
By Annie
at 2016-07-26T23:30
不過可能看主要的需求吧,純管理應該是或許還不需要
編譯 source code 部分不懂也沒差,懂好處大概是要改
可能會簡單一點
Heather avatar
By Heather
at 2016-07-27T12:00
要不要懂就看做什麼事了...XD
Isla avatar
By Isla
at 2016-07-31T19:40
真的很感謝,我還沒學到python,我就不客氣收下了XD

讓每個檔案的修改直接差一秒

Brianna avatar
By Brianna
at 2016-07-10T10:45
我因為windows檔案管理的關係,有時要用檔名,有時要用時間排序, 因此新檔案進來後我會先丟到linux裡面用touch調整時間。 現在我希望讓大量檔案的mtime只差一秒,我想過 find *.mp4 -exec touch {} \; mtime差距太短 find *.mp4 -exec sleep ...

systemd

Andrew avatar
By Andrew
at 2016-07-09T23:47
咦,練完「長生訣」,想來練「道心種魔大法」,還有在繼續吵!不看個 幾部武俠小說,那你就枉來人世間一遊了!XD 好了,版大有說了,不要吵架。這裡我不想寫什麼使用經驗之類的,那種 教條的東西,你去用就會熟能生巧,當初我也不會寫程式呀!去用了就會, 那沒什麼好談的。我想談的是武功的心法,不是招式, ...

Windows CentOS 雙系統怎麼裝?

Rebecca avatar
By Rebecca
at 2016-07-09T20:08
現在公司裝的是 CentOS 7 我想在家裝 Windows7 + CentOS 7 雙系統 但Google之後資訊很亂 Windows 7 裝完後,再裝CentOS , 開機選單並不會出現 (但聽說有些 Linux 版本會很友善地將Windows 加入開機選單,例如 ubuntu) 問題: 1. ...

systemd

Aaliyah avatar
By Aaliyah
at 2016-07-09T19:59
小弟只是個做embedded system的工程師,不過沒什麼在用linux orz 看了一下systemd的好處 感覺很多好處是因為systemd會幫你做很多事,但好像對效率、安全性等等都沒有著墨 有除了比較方便以外的理由嗎XD? 然後可攜性這理由很奇怪啊,你所謂的可攜應該是建立在大家都用systemd ...

posfix header_checks 的規則寫法請教

Kumar avatar
By Kumar
at 2016-07-08T21:31
大家好 最近想把一些垃圾信檔掉 他的主旨大概都是E55FR78G815這類亂數大寫英文+數字混雜,長度不一 我該如何設定規則DISCARD掉這些信呢 謝謝 /^Subject:^[0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z][0-9A-Z]/ DISCARD 有 ...