web-dev-qa-db-ja.com

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

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

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

しかし、それは機能していないようです。何かアイデアはありますか?

14
javamonkey79

これまでのすべての回答(および質問の例)は、「すべてのフォルダに触れる」と言った場合でも、ディレクトリ内のすべてを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またはThompsonシェル(代わりにエラーを報告する)以外のシェルに*というファイルが作成されます。ここでは、-cを使用して回避していますが、*と呼ばれる非ディレクトリファイルをtouchにすることもできます。

zshを使用して、隠しディレクトリを含むtouchディレクトリのみに:

touch -- *(D/)
22
Michael Mrozek

試す

touch ./*

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

touch -c ./*

jasonwryan's answer の優れた参考資料と、この one も参照してください。

11
jw013

あなたは ls)の出力を解析しようとするべきではありません

また、あなたの"$file"空白をキャプチャします。 http://www.grymoire.com/Unix/Quote.html を参照してください

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

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

より完全な説明については、最初の2つ Bash Pitfalls を参照してください。

7
jasonwryan