Bash

如何觸摸目錄中的所有內容,包括隱藏的,如目錄向上..

  • December 11, 2017

這個問題與“觸摸目錄中的所有文件夾”問題相似。

如何將touch目錄中的所有內容,

  • 遞歸地
  • 包括隱藏條目,如“目錄向上”...
  • 不取消引用符號連結touch -h
  • 使用參考文件touch -r <file>作為時間戳源

shell 腳本中?

如果您的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 沒有等效的 zshzargsksh93’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 的另一個問題是遍歷目錄樹時的錯誤(如拒絕訪問)會被靜默忽略。

引用自:https://unix.stackexchange.com/questions/410106