在我的媒体中心目录中,我的文件夹的所有修改时间都不是所需的日期。
如何将主文件夹的所有修改时间更改为每个文件夹内最新媒体文件的修改时间?
例如:
cd /tmp
mkdir test
cd test
mkdir d1
mkdir d2
touch d1/text1.txt
touch d1/movie1.mov
touch d2/text2.txt
touch d2/movie2.mov
touch notthis.file
现在我尝试了:
ls -td *| head -n 1
但这给出了:
notthis.file
答案1
和zsh
:
cd that-dir &&
touch -r *(D.om[1]) .
如果您还想考虑子目录中的文件:
touch -r **/*(D.om[1]) .
如果您想对每个非空目录递归地执行此操作:
for d (**/*(DFod)) touch -r $d/*(D.om[1]) -- $d
请注意,如果存在没有常规文件的非空目录(如果它们包含的所有文件都是非常规的,例如目录、符号链接、fifos...),您将收到“未找到匹配项”错误。为了避免这种情况,您可以将其更改为:
for d (**/*(DFod)) {
newest=($d/*(ND.om[1]))
(( $#newest )) && touch -r $newest -- $d
}
.
如果您不想限制为常规文件,请删除 glob 限定符;-
如果您还想考虑常规文件的符号链接(以及它们指向的文件的修改时间),请删除glob 限定符;或者^/
对于非目录文件替换为,或^/,F
除空目录(非目录或F
空目录)之外的任何类型的文件。
答案2
您可以使用以下怪物将目录your_dir
的时间戳设置为其最近修改的文件的时间戳:
touch -t `ls -ltr --time-style='+%Y%m%d%H%M.%S your_dir' | grep '^-' | tail -1 | awk '{print $6}'` your_dir
目前尚不清楚“主文件夹”是什么意思,所以我没有包含任何递归。
答案3
使用ls(1)
按修改时间对目录进行排序,head(1)
获取第一个文件,并touch(1)
更改目标目录的修改时间,这非常简单。
通常不建议解析 的输出,ls
因为很少有必要并且很容易陷入特殊字符,但是在这种情况下,我想不出另一个工具可以轻松地为您提供目录中具有最新时间戳的文件。
touch_dir() {
dir="$1"
touch --reference="$(ls -td -- "${dir}"/* | head -n 1)" -- "${dir}"
}
使用目录参数运行它,它应该将目录的修改时间设置为目录中任何文件的最新修改时间。
如果目录中没有文件(可以通过多种方式轻松测试)或者最新文件名嵌入换行符,则它将失败 -head
将仅获取新行之前的部分。
要更新多个目录,只需循环运行即可。