ディレクトリ内のすべてのファイルにアクセスするシェルスクリプトを作成しました/tmp
。ところで 'というエラーメッセージが表示されます
/bin/touch: Argument list too long
。問題の原因は何ですか?
#!/bin/bash
dayNo=1
while test $dayNo -le 200
do
touch `find /tmp/`
sleep 86000
done
ベストアンサー1
/tmp
ファイルが多すぎます。不適切コマンドラインにすべての名前を一度に表示します(パスにスペースがある場合は、使用しているバージョンも安全ではありません)。
良いニュースは、find
次のように安全かつ正確に実行できることです。
find /tmp -exec touch -c '{}' +
すべてのファイルは以前と同じように検索し、必要なだけ実行してtouch
毎回必要な数のファイルを実行します。
find
-exec
オプション一致するファイルを実行し、パスを置き換えるコマンドを受け入れます{}
。+
つまり、複数のファイルに対して一度に、または各ファイルに対して一度だけコマンドを実行します\;
。touch
コメントで指摘したように、-execdir touch -c '{}' \;
これは厳しく安全ですが、シングルユーザーシステムでは少し遅く、大きな利点はありません。まず、各サブディレクトリに切り替えてから、毎回そのディレクトリのファイルに対してのみコマンドを実行して、特定の競合状態を回避します。この-execdir
オプションは非標準拡張ですが、サポートされています。牛に似た一種の栄養、FreeBSD、オープンBSD、ネットワークBSDとオペレーティングシステム find
s;他の商用 Unices には通常この機能はありません。何を使用しているのかわかりませんが、該当する場合は上記を検討してください。