触摸目录中的所有文件夹

触摸目录中的所有文件夹

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

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

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

答案1

到目前为止的所有答案(以及问题中的示例)都假设您想要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 目录的符号链接除了普通目录之外
  • 它会忽略隐藏的
  • 如果没有目录或目录的符号链接,它将创建一个在、、或Thompson shell*之外的 shell 中调用的文件(这会报告错误)。在这里,我们正在使用它来解决这个问题,尽管这仍然可能是一个名为.cshtcshzshfish-ctouch*

使用zsh,touch仅适用于目录,包括隐藏目录:

touch -- *(D/)

答案2

尝试

touch ./*

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

touch -c ./*

另请参阅中的好参考杰森乌赖恩的回答还有这个

答案3

不应该尝试解析的输出ls

另外,您应该引用您"$file"来捕获任何空白。看http://www.grymoire.com/Unix/Quote.html

像这样的事情可能会实现你所追求的:

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

看前两个重击陷阱以获得更彻底的解释。

答案4

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

什么是最小深度和最大深度级别?

最大深度级别:下降到起点以下最多级别(非负整数)的目录级别。-maxdepth 0 表示仅将测试和操作应用于起点本身。

最小深度级别:不要在低于级别(非负整数)的级别应用任何测试或操作。 -mindepth 1 表示处理除起始点之外的所有文件。

一般来说,我们没有深度超过 8 的目录。因此,在上面的命令中,我将最大深度保留为 8。

相关内容