触摸目录中的所有文件夹


14

我正在尝试使用以下命令更新cwd中所有文件夹的时间戳:

for file in `ls`; do touch $file; done

但这似乎不起作用。有什么想法吗?

Answers:


21

到目前为止,所有答案(以及您在问题中的示例)都假定您要访问touch目录中的所有内容,即使您说“触摸所有文件夹”。如果事实证明目录包含文件和文件夹,而您只想更新文件夹,则可以使用find

$ find . -maxdepth 1 -mindepth 1 -type d -exec touch {} +

或者,如果您的find实现不支持非标准-mindepth/ -maxdepth谓词:

$ find . ! -name . -prune -type d -exec touch {} +

这个:

$ touch -c -- */

应该可以在大多数shell中工作,除了:

  • 除了普通目录外,它还将touch 符号链接到目录
  • 它将忽略隐藏的
  • 如果没有目录或符号链接的目录,它会创建一个名为*比其他炮弹cshtcshzshfish或者汤普森外壳(这反而会报告一个错误)。在这里,我们一直-c在解决它,尽管那仍然可能是touch一个名为的非目录文件*

使用zshtouch仅显示目录,包括隐藏目录:

touch -- *(D/)

'{} \ +'是什么意思?
2011年

3
{} \+是特殊的find语法-请阅读手册页以获取更多信息。我认为touch -c ./*/也可以。
2011年

2
您应该-maxdepth 1将命令包括在内,以免find递归到子文件夹中。OP似乎只想触摸cwd中的那些文件夹,而不是子文件夹。
史蒂文

1
@ jw013它将-您不断将好主意与其他人的答案联系起来:)
Michael Mrozek

为什么要转义+字符?有解释它的贝壳吗?
Witiko

11

尝试

touch ./*

它避免了不必要的for循环,该循环会为每个文件生成一个新的进程,并适用于所有文件名,即使是带有空格的文件或看起来像选项的文件名(如-t)。唯一不起作用的是,如果目录中没有文件(非点文件),在这种情况下,最终将创建名为的文件*。为了避免这种情况,对于touch大多数实现的特定情况,有一个-c选项(--no-create在GNU版本中也称为)不创建不存在的文件,即

touch -c ./*

也看到了很好的参考jasonwryan的回答,以及这一个


1
如果cwd中有100万个文件夹,将会发生什么情况?
史蒂文

如果遇到“参数列表过长”类型的问题,最好切换到“较重”的工具,例如find . -type d -maxdepth1 -print0 | xargs -0 touch,或上面的MichaelMrozek的答案
2011年

7

不应该尝试解析的输出ls

另外,您应引用"$file"捕获任何空格。参见http://www.grymoire.com/Unix/Quote.html

这样的事情可能会实现您的追求:

for file in *; do touch "$file"; done

有关更详尽的解释,请参阅前两个Bash陷阱


2
接近但不太完全。touch ./*在大多数情况下,A 应该有效。确实不需要for循环,因为touch可以接收多个文件,并且您需要./使用--help正确处理具有类似名称的文件。这是一个很好的资源
jw013 2011年

为什么“ *”有效?
javamonkey79 2011年

@ javamonkey79它的外壳通配符
jw013

1
@ jw013的要点:谢谢惠勒的链接。
jasonwryan 2011年

请注意,*不会捕获名称以点开头的文件和目录。解决该问题的一种方法是通过启用dotglobshell选项shopt -s dotglob
Witiko

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.