দেখে মনে হচ্ছে findযে ডিরেক্টরিগুলির বিষয়বস্তুগুলিকে পুনরাবৃত্তভাবে চলার জন্য প্রদত্ত পাথটি কোনও ফাইল বা ডিরেক্টরিতে সামঞ্জস্য করে কিনা।
এখানে কিছুটা অনুপ্রেরণা এবং আমি স্থানীয়ভাবে যা করেছি তা বোঝাতে যে find . -type fসত্যিকারের চেয়ে ধীর find .। আমি এখনও জিএনইউ সোর্স কোডটি খুঁজে পাইনি।
সুতরাং আমি আমার $HOME/Workspaceডিরেক্টরিতে কিছু ফাইল ব্যাক আপ করছি এবং এমন ফাইলগুলি বাদ দিচ্ছি যা হয় হয় আমার প্রকল্পগুলির নির্ভরতা বা সংস্করণ নিয়ন্ত্রণ ফাইল।
সুতরাং আমি নিম্নলিখিত কমান্ড চালিত যা দ্রুত কার্যকর করা হয়
% find Workspace/ | grep -v '/vendor\|/node_modules/\|Workspace/sources/\|/venv/\|/.git/' > ws-files-and-dirs.txt
findপাইপগুলি grepখারাপ ফর্ম হতে পারে তবে এটি একটি অবহেলিত রেজেক্স ফিল্টারটি ব্যবহার করার সবচেয়ে সহজ উপায় বলে মনে হয়েছিল।
নিম্নলিখিত কমান্ডটি অনুসন্ধানের আউটপুটগুলিতে কেবল ফাইলগুলি অন্তর্ভুক্ত করেছে এবং লক্ষণীয়ভাবে বেশি সময় নিয়েছে।
% find Workspace/ -type f | grep -v '/vendor\|/node_modules/\|Workspace/sources/\|/venv/\|/.git/' > ws-files-only.txt
আমি (সঙ্গে এই দুটি কমান্ড কর্মক্ষমতা পরীক্ষা করার জন্য কিছু কোড লিখেছেন dashএবং tcshঠিক কোন প্রভাব শেল থাকতে পারে বাতিল করতে, যদিও সেখানে কোনো করা উচিত হবে না)। tcshফলাফল বাদ দেওয়া হয়েছে, কারণ তারা মূলত একই আছেন।
ফলাফল পেয়েছি প্রায় 10% পারফরম্যান্স জরিমানা -type f
প্রোগ্রামের আউটপুট এখানে বিভিন্ন কমান্ডের 1000 পুনরাবৃত্তিগুলি কার্যকর করতে সময় পরিমাণ দেখাচ্ছে showing
% perl tester.pl
/bin/sh -c find Workspace/ >/dev/null
82.986582
/bin/sh -c find Workspace/ | grep -v '/vendor\|/node_modules/\|Workspace/sources/\|/venv/\|/.git/' > /dev/null
90.313318
/bin/sh -c find Workspace/ -type f >/dev/null
102.882118
/bin/sh -c find Workspace/ -type f | grep -v '/vendor\|/node_modules/\|Workspace/sources/\|/venv/\|/.git/' > /dev/null
109.872865
দিয়ে পরীক্ষিত
% find --version
find (GNU findutils) 4.4.2
Copyright (C) 2007 Free Software Foundation, Inc.
উবুন্টু 15.10 এ
বেঞ্চমার্কিংয়ের জন্য আমি পার্ল স্ক্রিপ্টটি এখানে ব্যবহার করেছি
#!/usr/bin/env perl
use strict;
use warnings;
use Time::HiRes qw[gettimeofday tv_interval];
my $max_iterations = 1000;
my $find_everything_no_grep = <<'EOF';
find Workspace/ >/dev/null
EOF
my $find_everything = <<'EOF';
find Workspace/ | grep -v '/vendor\|/node_modules/\|Workspace/sources/\|/venv/\|/.git/' > /dev/null
EOF
my $find_just_file_no_grep = <<'EOF';
find Workspace/ -type f >/dev/null
EOF
my $find_just_file = <<'EOF';
find Workspace/ -type f | grep -v '/vendor\|/node_modules/\|Workspace/sources/\|/venv/\|/.git/' > /dev/null
EOF
my @finds = ($find_everything_no_grep, $find_everything,
$find_just_file_no_grep, $find_just_file);
sub time_command {
my @args = @_;
my $start = [gettimeofday()];
for my $x (1 .. $max_iterations) {
system(@args);
}
return tv_interval($start);
}
for my $shell (["/bin/sh", '-c']) {
for my $command (@finds) {
print "@$shell $command";
printf "%s\n\n", time_command(@$shell, $command);
}
}
-type fএবং ছাড়াও 2,8 কে ফাইলগুলি একই সময়ে চালিত হয় । তবে প্রথমবারে লিনাক্স কার্নেল এটিকে ক্যাশে লোড করেছিল এবং খুব প্রথম ধীরে ধীরে এটি খুঁজে পাওয়া যায়।
-type fঘটেছিল তা আবিষ্কার করতে পেরেছি এবং আমি এটি একটি এবং একটিতে করেছি এবং ট্রেসটি প্রায় অভিন্ন ছিল, কেবলমাত্র সেই কলগুলিতে পৃথক হয় যেগুলির মধ্যে ডিরেক্টরি নাম ছিল। সুতরাং, আমি জানি না, তবে আমি উত্তরটি জানতে চাই। findstat()fstat()stracefind . find . -type fwrite()
timeবিল্টিন কমান্ড রয়েছে যে কোনও কমান্ড কার্যকর করতে কতক্ষণ সময় নেয় তা দেখার জন্য আপনাকে সত্যিকার অর্থে পরীক্ষা করার জন্য একটি কাস্টম স্ক্রিপ্ট লেখার দরকার নেই।
findযে ডিরেক্টরিগুলির বিষয়বস্তুগুলিকে পুনরাবৃত্তভাবে চলার জন্য প্রদত্ত পাথটি কোনও ফাইল বা ডিরেক্টরিতে সামঞ্জস্য করে কিনা। - এটি ডিরেক্টরি কিনা এটি যাচাই করতে হবে, এটি কোনও ফাইল কিনা তা যাচাই করতে হবে না। অন্যান্য প্রবেশের ধরণ রয়েছে: নামযুক্ত পাইপ, প্রতীকী লিঙ্কগুলি, বিশেষ ডিভাইসগুলি, সকেটগুলি ব্লক করুন ... সুতরাং এটি ডিরেক্টরিটি কিনা তা ইতিমধ্যে চেকটি করতে পেরেছে, এর অর্থ এই নয় যে এটি কোনও নিয়মিত ফাইল কিনা তা জানে না।