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


13

私はこれを使用してCWD内のすべてのフォルダのタイムスタンプを更新しようとしています:

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

しかし、うまくいかないようです。なぜアイデアがありますか?

回答:


21

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

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

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

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

この:

$ touch -c -- */

以下を除くほとんどのシェルで動作するはずです:

  • また、プレーンディレクトリに加えてtouch ディレクトリへのシンボリックリンクも作成します
  • 隠されたものを省略します
  • ディレクトリへのディレクトリやシンボリックリンクがありません場合は、それが呼ばれるファイル作成します*以外のシェルではcshtcshzshfishまたは(代わりに、エラーを報告します)トンプソンシェルを。ここでは、それを-c回避するために使用していますが、それはまだtouchディレクトリ以外のファイルと呼ばれる可能性があります*

zshに、touch隠されたものを含むディレクトリのみ、:

touch -- *(D/)

「{} \ +」とは何ですか?
javamonkey79

3
{} \+特別であるfind構文-より多くのmanページをお読みください。touch -c ./*/うまくいくと思います。
-jw013

2
サブフォルダーに再帰しない-maxdepth 1ように、コマンドに含める必要がありfindます。OPはサブフォルダーではなく、cwd内のフォルダーのみをタッチしたいようです。
スティーブン

1
@ jw013それはそうです-あなたは他の人の答えに良いアイデアを付け続けます:)
マイケルMrozek

なぜ+文字をエスケープしますか?それを解釈するシェルはありますか?
ウィティコ

11

試してみる

touch ./*

これは、forすべてのファイルに対して新しいプロセスを生成する不必要なループを回避し、すべてのファイル名に対して機能します。スペースを含むものやオプションのように見えるものも含めます-t。動作しないのは、ディレクトリに(ドット以外の)ファイルがない場合だけです。その場合、という名前のファイルが作成され*ます。それを避けるために、touchほとんどの実装の特定の場合には、存在しないファイルを作成しない-cオプション(--no-createGNUバージョンでも呼ばれます)があります。

touch -c ./*

また、中には良いリファレンスを参照してくださいjasonwryanの答えだけでなく、このものを


1
cwdに100万個のフォルダーがある場合はどうなりますか?
スティーブン

「引数リストが長すぎる」タイプの問題に遭遇した場合、おそらくのような「重い」ツールfind . -type d -maxdepth1 -print0 | xargs -0 touch、または上記のMichaelMrozekの答えに切り替えることをお勧めします
jw013

7

あなたはの出力を解析するために試みるべきではありませんls

また、"$file"空白をキャプチャするには引用符で囲む必要があります。http://www.grymoire.com/Unix/Quote.htmlを参照してください

このような何かがあなたが望んでいることを達成するかもしれません:

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

より詳細な説明については、最初の2つのBashの落とし穴を参照してください。


2
近いが完全ではない。A touch ./*はほとんどの場合に機能するはずです。複数のファイルを受け取ることができるforので、ループは本当に必要ありません。またtouch、適切./な名前のファイルを処理する必要があり--helpます。これは、主題に関する優れたリソースです。
jw013

なぜ「*」が機能するのですか?
javamonkey79

@ javamonkey79それはシェルのグロブ
jw013

1
@ jw013すばらしい点:ウィーラーリンクをありがとう。
jasonwryan

*名前がドットで始まるファイルとディレクトリはキャプチャしないことに注意してください。これを修正する1つの方法は、でdotglobシェルオプションを有効にすることですshopt -s dotglob
ウィティコ

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.