一般化する
ls
端末の次のコマンドが10秒を待たずにディレクトリ内のファイルをすぐに一覧表示するように、bashスクリプトでどのコマンドを実行できますか?
「追加情報」の最後にある質問1と質問2を参照してください。
詳細
私のディレクトリには、100 MBから1 GBのサイズの700のビデオファイル(mp4)があります。平均ファイルサイズは200MBです。
起動後に初めてファイルを一覧表示する場合(ターミナルでlsを使用するか、pcmanfmを使用して)、ファイルの一覧表示には10秒かかります。後でファイルを再リストすると(lsまたはpcmanfmを使用)、ファイルはほぼ直ちにリストされます。
したがって、この初期待ち時間をバイパスするために、起動後にスクリプトで次のコマンドを実行しました。
ls /path/to/vid-directory
...lsまたはpcmanfmを使用してディレクトリを一覧表示すると、ファイルはすぐに一覧表示されます。
しかし、奇妙に走る
ls /path/to/vid-directory
SCRIPT の NEXT は、ls または pcmanfm がファイルを直ちにリストしないようにします (10 秒後にリスト)。また、奇妙なことは、初期スクリプトが実行されたときにファイルがほぼすぐにリストされることです。
したがって、端末でlsを実行するとRAMキャッシュにファイル名が格納されるように見えますが、スクリプトでlsを実行するとそうではありません*。
質問1:なぜ後者*が発生するのですか?
質問2:次のlsまたはpcmanfmがすぐにファイルを一覧表示できるようにするには、スクリプトでどのコマンドを実行する必要がありますか?
PS:テストするときは、以下を実行してRAMが最初に空であることを確認しました。
sudo sh -c 'echo 3 > /proc/sys/vm/drop_caches'
答え1
ls
端末とスクリプトls
の間の唯一の違いは、エイリアスを使用してls
ファイル名のリストだけでなく、ファイルのプロパティも読み取る必要があるオプションを渡すことです。オプションはおそらくです--color
。ファイル名のリストを読み取るにはディレクトリ自体からのみ読み取る必要がありますが、ファイル属性を読み取るには(lstat
システムコールを介して)各ファイルのinodeにアクセスする必要があります。したがって、スクリプトを実行すると、そのls
属性ではなくファイル名のみがキャッシュに残ります。プロパティは、端末で初めてls
実行するとき、またはGUIファイルマネージャを使用するときにロードする必要があります。
ls
端末が使用するスクリプトに同じオプションを渡します。
10秒以内に700個のファイルをリストするのはとても遅いです。ファイルサイズは重要ではありません。一般的な最新のシステムは、数万または数十万のファイルを処理するときにのみ顕著に遅くなり始めます。
答え2
以下を実行して問題を正確に見つけることができます。
strace -tt -o ls.strace ls /path/to/directory
出力ls
速度を上げることができますls -U
が、もちろんこれは出力を変更します。
700個のファイルは大きな数字ではありません。すべてのディレクトリエントリを再構築すると、速度がある程度向上する可能性があります。
mkdir /tmpdir/on/the/same/filesystem
mv * /tmpdir/on/the/same/filesystem
mv /tmpdir/on/the/same/filesystem/* .
ただし、おそらく最も効率的な解決策は、起動時にバックグラウンドでこのディレクトリを自動的に読み取ることです。