我正在尝试使用以下命令更新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陷阱。
*不会捕获名称以点开头的文件和目录。解决该问题的一种方法是通过启用dotglobshell选项shopt -s dotglob。