※ 引述《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 时候需要
比较复杂的处理可以使用的好工具。