私はこれを使用してcwd内のすべてのフォルダーのタイムスタンプを更新しようとしています:
for file in `ls`; do touch $file; done
しかし、それは機能していないようです。何かアイデアはありますか?
これまでのすべての回答(および質問の例)は、「すべてのフォルダに触れる」と言った場合でも、ディレクトリ内のすべてをtouch
することを想定しています。ディレクトリにファイルとフォルダーが含まれていて、フォルダーのみを更新したい場合は、find
を使用できます。
$ find . -maxdepth 1 -mindepth 1 -type d -exec touch {} +
または、find
実装が非標準の-mindepth
/-maxdepth
述部をサポートしていない場合:
$ find . ! -name . -Prune -type d -exec touch {} +
この:
$ touch -c -- */
それ以外のほとんどのシェルで動作するはずです:
touch
ディレクトリへのシンボリックリンクにもなりますcsh
、tcsh
、zsh
、fish
またはThompsonシェル(代わりにエラーを報告する)以外のシェルに*
というファイルが作成されます。ここでは、-c
を使用して回避していますが、*
と呼ばれる非ディレクトリファイルをtouch
にすることもできます。zsh
を使用して、隠しディレクトリを含むtouch
ディレクトリのみに:
touch -- *(D/)
試す
touch ./*
不要なfor
ループを回避して、すべてのファイルに対して新しいプロセスを生成し、スペースのあるファイルやオプションのように見えるファイル(-t
など)も含め、すべてのファイル名で機能します。これが機能しないのは、ディレクトリに(ドット以外の)ファイルがない場合のみです。この場合、*
という名前のファイルが作成されます。これを回避するため、touch
の特定のケースでは、ほとんどの実装に-c
オプション(--no-create
とも呼ばれるGNUバージョン))があり、存在しないファイル、すなわち.
touch -c ./*
jasonwryan's answer の優れた参考資料と、この one も参照してください。
あなたは ls
)の出力を解析しようとするべきではありません 。
また、あなたの"$file"
空白をキャプチャします。 http://www.grymoire.com/Unix/Quote.html を参照してください
このような何かがあなたが望むものを達成するかもしれません:
for file in *; do touch "$file"; done
より完全な説明については、最初の2つ Bash Pitfalls を参照してください。