ディレクトリ内のすべてのフォルダをタッチします。

ディレクトリ内のすべてのフォルダをタッチします。

次のコマンドを使用して、cwdのすべてのフォルダのタイムスタンプを更新しようとします。

for file in `ls`; do touch $file; done

しかし、これはうまくいかないようです。どんなアイデアがありますか?

答え1

touchこれまでのすべての答え(および質問の例)は、「すべてのフォルダをタッチする」と言っても、ディレクトリ内のすべての項目が欲しいと仮定しています。ディレクトリにファイルとフォルダが含まれていて、フォルダのみを更新したい場合は、次のものを使用できますfind

$ find . -maxdepth 1 -mindepth 1 -type d -exec touch {} +

または、find実装が非標準-mindepth/-maxdepth述語をサポートしていない場合:

$ find . ! -name . -prune -type d -exec touch {} +

これ:

$ touch -c -- */

以下を除くほとんどのシェルで動作します。

  • それもtouch ディレクトリへのシンボリックリンク通常のディレクトリに加えて
  • 隠されたものを無視します
  • ディレクトリがない場合、またはディレクトリへのシンボリックリンクがない場合は、*ThompsonシェルではなくシェルまたはThompsonシェルから呼び出されるファイルを生成します(この場合はエラーが報告されます)。ここではこの問題を解決するためにこれを使用していますが、それでも問題がある可能性があります。cshtcshzshfish-ctouch*

隠しディレクトリを含むディレクトリにのみzsh使用してください。touch

touch -- *(D/)

答え2

努力する

touch ./*

各ファイルに対して新しいプロセスを生成する不要なループを防ぎ、forすべてのファイル名に対して機能します。空白があるか、オプションのように見える名前にも機能します(例-t:)。これが機能しない唯一の場合は、ディレクトリに(ドットではない)ファイルがない場合です。*これを防ぐために、ほとんどの実装固有のtouchケースには次のものがあります。-cオプション(--no-createGNUバージョンでも呼び出されます)は、存在しないファイルを生成しません。

touch -c ./*

また、良い参考資料を参照してくださいジェイソン尿の答えこの一つ

答え3

あなた解析を試みてはいけない出力ls

また、"$file"空白をキャッチするには引用符を使用する必要があります。バラよりhttp://www.grymoire.com/Unix/Quote.html

これはあなたが望むものを達成することができます:

for file in *; do touch "$file"; done

最初の2つを見てください。ヘビーヒートトラップより詳細な説明のために。

答え4

find . -maxdepth 8 -mindepth 1 -type d -exec touch {} +

最小と最大の深さレベルは何ですか?

最大深さレベル:始点より下の最も高いレベル(負以外の整数)に下がるディレクトリレベル。 -maxlength 0 は、始点自体にのみテストと操作を適用することを意味します。

最小深さレベル:レベル(負以外の整数)より低いレベルでは、テストや操作を適用しないでください。 -minlength 1 は、始点を除くすべてのファイルを処理することを意味します。

通常、8より深いディレクトリはありません。そこで、上記のコマンドでは最大深さを8にしました。

関連情報