私はこれを使用してCWD内のすべてのフォルダのタイムスタンプを更新しようとしています:
for file in `ls`; do touch $file; done
しかし、うまくいかないようです。なぜアイデアがありますか?
私はこれを使用して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または(代わりに、エラーを報告します)トンプソンシェルを。ここでは、それを-c回避するために使用していますが、それはまだtouchディレクトリ以外のファイルと呼ばれる可能性があります*。とzshに、touch隠されたものを含むディレクトリのみ、:
touch -- *(D/)
{} \+特別であるfind構文-より多くのmanページをお読みください。touch -c ./*/うまくいくと思います。
-maxdepth 1ように、コマンドに含める必要がありfindます。OPはサブフォルダーではなく、cwd内のフォルダーのみをタッチしたいようです。
試してみる
touch ./*
これは、forすべてのファイルに対して新しいプロセスを生成する不必要なループを回避し、すべてのファイル名に対して機能します。スペースを含むものやオプションのように見えるものも含めます-t。動作しないのは、ディレクトリに(ドット以外の)ファイルがない場合だけです。その場合、という名前のファイルが作成され*ます。それを避けるために、touchほとんどの実装の特定の場合には、存在しないファイルを作成しない-cオプション(--no-createGNUバージョンでも呼ばれます)があります。
touch -c ./*
また、中には良いリファレンスを参照してくださいjasonwryanの答えだけでなく、このものを。
あなたはの出力を解析するために試みるべきではありませんls。
また、"$file"空白をキャプチャするには引用符で囲む必要があります。http://www.grymoire.com/Unix/Quote.htmlを参照してください
このような何かがあなたが望んでいることを達成するかもしれません:
for file in *; do touch "$file"; done
より詳細な説明については、最初の2つのBashの落とし穴を参照してください。
*名前がドットで始まるファイルとディレクトリはキャプチャしないことに注意してください。これを修正する1つの方法は、でdotglobシェルオプションを有効にすることですshopt -s dotglob。