如何觸摸目錄中的所有內容,包括隱藏的,如目錄向上..
?
這個問題與“觸摸目錄中的所有文件夾”問題相似。
如何將
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-h
from)和 FreeBSDtouch
,使用目標的修改時間有或沒有-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 沒有等效的 zsh
zargs
或ksh93
’scommand -x
來拆分命令行以避免arg 列表太長的問題。在 GNU 系統上,您始終可以使用 GNUxargs
:xargs -r0a <( shopt -s dotglob nullglob globstar printf '%s\0' "$dir/"{.,..,**} ) touch -c -h -r "$reference_file" --
現在,我可能還會
find
在這裡使用。除了較差的性能之外,glob 的另一個問題是遍歷目錄樹時的錯誤(如拒絕訪問)會被靜默忽略。