Pro Backup Asked: 2017-12-11 13:09:04 +0800 CST2017-12-11 13:09:04 +0800 CST 2017-12-11 13:09:04 +0800 CST 如何触摸目录中的所有内容,包括隐藏的,如目录向上`..`? 772 这个问题与“触摸目录中的所有文件夹”问题相似。 如何将touch目录中的所有内容, 递归地 包括隐藏条目,如“目录向上”..和. 不取消引用符号链接touch -h和 使用参考文件touch -r <file>作为时间戳源 从shell 脚本中? bash shell-script 1 个回答 Voted Best Answer Stéphane Chazelas 2017-12-11T13:35:49+08:002017-12-11T13:35:49+08:00 如果您的touch命令支持-h不取消引用: find . -depth -exec touch -h -r "$reference_file" {} + touch -c -h -r "$reference_file" .. (请注意这-h意味着-c(如果 NetBSD/FreeBSD 不存在文件,但 GNU 或 busybox 不存在,则避免创建文件touch(尽管使用 GNUtouch它也不会创建文件并打印错误消息),因此-c在此处添加以增加可移植性)。 find或者使用可以减少touch正在运行的命令数量的单个命令: find .. . -depth \( ! -name .. -o -prune \) -exec touch -c -h -r "$reference_file" {} + 也就是说,添加..到给定的文件列表中find,但告诉find修剪它(而不是深入其中)。 对于任意目录(以及其路径不以以下开头的目录-: find "$dir/.." "$dir/" \( ! -name .. -o -prune \) \ -exec touch -c -h -r "$reference_file" {} + (这里使用$dir/而不是指指向目录的符号链接$dir的情况)。$dir 使用 BSD find,您可以使用 find -f "$dir/.." -f "$dir/" \( ! -name .. -o -prune \) \ -exec touch -c -h -r "$reference_file" -- {} + 避免以 .$dir开头的问题-。 尽管您也可以这样做: ( cd -P -- "$dir/" && exec find .. . \( ! -name .. -o -prune \) \ -exec touch -c -h -r "$reference_file" {} + ) (假设$reference_file不是相对路径)。 请注意,如果$reference_file是符号链接,使用 GNUtouch和 with-h时,将使用符号链接的修改时间(不使用目标的修改时间-h),而对于 NetBSD(where -hfrom)和 FreeBSD touch,使用目标的修改时间有或没有-h。 如果使用zsh,您可以使用它的递归通配符 autoload zargs zargs -- $dir/{.,..,**/*(NDoN)} -- touch -c -h -r $reference_file -- (oN对于不排序列表可以省略,这只是为了优化)。 ksh93 最终在 2005 年增加了对 zsh 的递归通配符的支持,带有globstar选项。 (set -o globstar; FIGNORE= command -x touch -c -h -r "$reference_file" -- ~(N)"$dir"/**) 但是请注意,这ksh将包括所有.和..条目,因此所有目录都将被多次触及。 bash 最终globstar在 2009 年复制了 ksh93,但最初是 /broken/ ,因为它在降级目录时遵循符号链接。它于 2014 年在 4.3 中修复。 bash 没有等效的 zshzargs或ksh93'scommand -x来拆分命令行以避免arg 列表太长的问题。在 GNU 系统上,您始终可以使用 GNU xargs: xargs -r0a <( shopt -s dotglob nullglob globstar printf '%s\0' "$dir/"{.,..,**} ) touch -c -h -r "$reference_file" -- 现在,我可能还会find在这里使用。除了较差的性能之外,glob 的另一个问题是遍历目录树时的错误(如拒绝访问)会被静默忽略。
如果您的
touch
命令支持-h
不取消引用:(请注意这
-h
意味着-c
(如果 NetBSD/FreeBSD 不存在文件,但 GNU 或 busybox 不存在,则避免创建文件touch
(尽管使用 GNUtouch
它也不会创建文件并打印错误消息),因此-c
在此处添加以增加可移植性)。find
或者使用可以减少touch
正在运行的命令数量的单个命令:也就是说,添加
..
到给定的文件列表中find
,但告诉find
修剪它(而不是深入其中)。对于任意目录(以及其路径不以以下开头的目录
-
:(这里使用
$dir/
而不是指指向目录的符号链接$dir
的情况)。$dir
使用 BSD
find
,您可以使用避免以 .
$dir
开头的问题-
。尽管您也可以这样做:
(假设
$reference_file
不是相对路径)。请注意,如果
$reference_file
是符号链接,使用 GNUtouch
和 with-h
时,将使用符号链接的修改时间(不使用目标的修改时间-h
),而对于 NetBSD(where-h
from)和 FreeBSDtouch
,使用目标的修改时间有或没有-h
。如果使用
zsh
,您可以使用它的递归通配符(
oN
对于不排序列表可以省略,这只是为了优化)。ksh93 最终在 2005 年增加了对 zsh 的递归通配符的支持,带有
globstar
选项。但是请注意,这
ksh
将包括所有.
和..
条目,因此所有目录都将被多次触及。bash 最终
globstar
在 2009 年复制了 ksh93,但最初是 /broken/ ,因为它在降级目录时遵循符号链接。它于 2014 年在 4.3 中修复。bash 没有等效的 zsh
zargs
或ksh93
'scommand -x
来拆分命令行以避免arg 列表太长的问题。在 GNU 系统上,您始终可以使用 GNUxargs
:现在,我可能还会
find
在这里使用。除了较差的性能之外,glob 的另一个问题是遍历目录树时的错误(如拒绝访问)会被静默忽略。