「..」ディレクトリなどの隠しアイテムを含む、ディレクトリ内のすべてのアイテムにどのように触れることができますか?

「..」ディレクトリなどの隠しアイテムを含む、ディレクトリ内のすべてのアイテムにどのように触れることができますか?

この質問は、「という質問に関連しています。ディレクトリ内のすべてのフォルダをタッチします。」。

touchディレクトリ内のすべてを処理する方法

  • 再帰的
  • ..「directory up」などの隠し項目が含まれています。.
  • touch -hシンボリックリンクを逆参照する必要はありません。
  • 参照ファイルをtouch -r <file>タイムスタンプソースとして使用する

    一つの中でシェルスクリプト

答え1

touchあなたのコマンドが-hサポートしている場合逆参照しない:

find . -depth -exec touch -h -r "$reference_file" {} +
touch -c -h -r "$reference_file" ..

(これは、ファイルが存在しない場合、NetBSD / FreeBSDはファイルの生成を避けますが、GNUまたはbusyboxはそうではないことを意味します-h(GNUではファイルを生成せずにエラーメッセージを印刷します)。 )。-ctouchtouch-c

または、単一のコマンドを使用して実行中のコマンドの数を減らしますfindtouch

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シンボリックリンクの場合、次のようにGNUをtouch使用するとき-h-h-hそれはどこから出た)とFreeBSDでは、touchターゲットの修正時間を使用することも、使用しないこともあります-h

以下を使用する場合は、zsh再帰ワイルドカードを使用できます。

autoload zargs
zargs -- $dir/{.,..,**/*(NDoN)} -- touch -c -h -r $reference_file --

oNソートされていないリストは省略できます。これは最適化のみを目的としています。)

ksh93はついに2005年にこのglobstarオプションを使用してzsh再帰ワイルドカードのサポートを追加しました。

(set -o globstar; FIGNORE=
 command -x touch -c -h -r "$reference_file" -- ~(N)"$dir"/**)

ただし、ここkshにはすべての項目.と項目が含まれているため、すべてのディレクトリが..複数回タッチされます。

bashは最終的に2009年にksh93を複製しましたが、globstarもともとはディレクトリを下るときにシンボリックリンクに従ったので/broken/でした。 2014年4.3で修正されました。

bashには、コマンドラインを分割して回避するためのzshzargsまたはksh93zshと同じ機能はありません。command -x引数のリストが長すぎます。質問。 GNUシステムでは、いつでもGNUを使用してxargs次のことができます。

xargs -r0a <(
  shopt -s dotglob nullglob globstar
  printf '%s\0' "$dir/"{.,..,**}
) touch -c -h -r "$reference_file" --

今私はおそらくfindこれを使い続けます。パフォーマンスの低下に加えて、globのもう1つの問題は、ディレクトリツリーの閲覧中に発生するエラー(アクセス拒否など)が自動的に無視されることです。

関連情報