私はこれを使用して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-create
GNUバージョンでも呼ばれます)があります。
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
。