AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 410106
Accepted
Pro Backup
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 1 个回答
  • 1842 Views

1 个回答

  • Voted
  1. 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 的另一个问题是遍历目录树时的错误(如拒绝访问)会被静默忽略。

    • 3

相关问题

  • 从文本文件传递变量的奇怪问题

  • 虽然行读取保持转义空间?

  • MySQL Select with function IN () with bash array

  • `tee` 和 `bash` 进程替换顺序

  • 运行一个非常慢的脚本直到它成功

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    JSON数组使用jq来bash变量

    • 4 个回答
  • Marko Smith

    日期可以为 GMT 时区格式化当前时间吗?[复制]

    • 2 个回答
  • Marko Smith

    bash + 通过 bash 脚本从文件中读取变量和值

    • 4 个回答
  • Marko Smith

    如何复制目录并在同一命令中重命名它?

    • 4 个回答
  • Marko Smith

    ssh 连接。X11 连接因身份验证错误而被拒绝

    • 3 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Marko Smith

    systemctl 命令在 RHEL 6 中不起作用

    • 3 个回答
  • Marko Smith

    rsync 端口 22 和 873 使用

    • 2 个回答
  • Marko Smith

    以 100% 的利用率捕捉 /dev/loop -- 没有可用空间

    • 1 个回答
  • Marko Smith

    jq 打印子对象中所有的键和值

    • 2 个回答
  • Martin Hope
    EHerman JSON数组使用jq来bash变量 2017-12-31 14:50:58 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Drux 日期可以为 GMT 时区格式化当前时间吗?[复制] 2017-12-26 11:35:07 +0800 CST
  • Martin Hope
    AllisonC 如何复制目录并在同一命令中重命名它? 2017-12-22 05:28:06 +0800 CST
  • Martin Hope
    Steve “root”用户的文件权限如何工作? 2017-12-22 02:46:01 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST
  • Martin Hope
    Cbhihe 将默认编辑器更改为 vim for _ sudo systemctl edit [unit-file] _ 2017-12-03 10:11:38 +0800 CST
  • Martin Hope
    showkey 如何下载软件包而不是使用 apt-get 命令安装它? 2017-12-03 02:15:02 +0800 CST
  • Martin Hope
    youxiao 为什么目录 /home、/usr、/var 等都具有相同的 inode 编号 (2)? 2017-12-02 05:33:41 +0800 CST
  • Martin Hope
    user223600 gpg —list-keys 命令在将私钥导入全新安装后输出 uid [未知] 2017-11-26 18:26:02 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve