我正在尝试使用以下命令更新cwd中所有文件夹的时间戳:
for file in `ls`; do touch $file; done
但这似乎不起作用。有什么想法吗?
我正在尝试使用以下命令更新cwd中所有文件夹的时间戳:
for file in `ls`; do touch $file; done
但这似乎不起作用。有什么想法吗?
Answers:
到目前为止,所有答案(以及您在问题中的示例)都假定您要访问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
符号链接到目录*
比其他炮弹csh
,tcsh
,zsh
,fish
或者汤普森外壳(这反而会报告一个错误)。在这里,我们一直-c
在解决它,尽管那仍然可能是touch
一个名为的非目录文件*
。使用zsh
,touch
仅显示目录,包括隐藏目录:
touch -- *(D/)
{} \+
是特殊的find
语法-请阅读手册页以获取更多信息。我认为touch -c ./*/
也可以。
-maxdepth 1
将命令包括在内,以免find
递归到子文件夹中。OP似乎只想触摸cwd中的那些文件夹,而不是子文件夹。
尝试
touch ./*
它避免了不必要的for
循环,该循环会为每个文件生成一个新的进程,并适用于所有文件名,即使是带有空格的文件或看起来像选项的文件名(如-t
)。唯一不起作用的是,如果目录中没有文件(非点文件),在这种情况下,最终将创建名为的文件*
。为了避免这种情况,对于touch
大多数实现的特定情况,有一个-c
选项(--no-create
在GNU版本中也称为)不创建不存在的文件,即
touch -c ./*
也看到了很好的参考jasonwryan的回答,以及这一个。
另外,您应引用"$file"
捕获任何空格。参见http://www.grymoire.com/Unix/Quote.html
这样的事情可能会实现您的追求:
for file in *; do touch "$file"; done
有关更详尽的解释,请参阅前两个Bash陷阱。
*
不会捕获名称以点开头的文件和目录。解决该问题的一种方法是通过启用dotglob
shell选项shopt -s dotglob
。