نظرة عن قرب حول أداة البحث find

بسم الله و الحمد لله و الصلاة و السلام على رسول الله و آله و أصحابه و من اتبع هداه.

*نظرة عن قرب حول أداة البحث عن الملفات - find

طبيعي أن كل مستخدم يعمل على ملفات على النظام و بشتى الصيغ.يمر الوقت و تتكاثر الملفات.خصوصا أن مشكل المساحة لم يعد مشكل.
الملفات اذا كانت قليلة يسهل تذكرها و تذكر أسماءها و أين توجد على الجهاز.مع مرور الوقت تصعب المهمة.
على جنو/لينكس توجد أدوات قوية تساعد على البحث عن الملفات أينما كانت و بأي صيغة و في وقت وجيز.
من هذه الأدوات أداة - find .
دورها البحث عن الملفات على النظام. و تكمن قوتها في الخصائص التي تضاف لها و أيضا تنسيقها مع أدوات أخرى مثل ؛ pip grep xargs -exec و غيرها.
** طريقة عمل الأداة :
***تشغيل الأداة بدون أي لاحقة يقوم بالبحث على جميع النظام و عن جميع الملفات :

find

لكي نقوم بالبحث في المسار الحالي. نضع نقطة بعد الأمر. مثال :

find .

النتيجة.هذا مجلد وضعت في ملفات عشوئيا خصيصا لهذا الموضوع.


.
./001.jpg
./002.jpg
./003.jpg
./004.jpg
./005.jpg                                ./AnotherPdf.pdf
./AuD12345io.mp3                         ./001.mp3
./003.mp3                                ./004.mp3
./005.mp3
./006.mp3
./007.mp3
./008.mp3
./009.mp3
./010.mp3
./001.pdf
./002.pdf
./003.pdf
./005.pdf
./006.pdf
./007.pdf
./008.pdf
./009.pdf
./010.pdf
./dir1
./dir1/001.pdf
./dir1/002.pdf
./dir1/003.pdf
./dir1/004.pdf
./dir1/005.pdf
./dir1/006.pdf
./dir1/007.pdf
./dir1/008.pdf
./dir1/009.pdf
./dir1/010.pdf
./dir2
./dir2/001.txt
./dir2/002.txt
./dir2/003.txt
./dir2/004.txt
./dir2/005.txt
./dir2/006.txt
./dir2/007.txt
./dir2/008.txt
./dir2/009.txt
./dir2/010.txt
./dir2/{D1..D5}
./dir3
./dir3/001.c
./dir3/002.c
./dir3/003.c
./dir3/004.c
./dir3/005.c
./dir3/006.c
./dir3/007.c
./dir3/008.c
./dir3/009.c
./dir3/010.c
./dir3/{D1..D5}
./dir4
./dir4/{D1..D5}
./dir5
./dir5/{D1..D5}
./dir5/Fo-L-d_Er1
./dir5/Fo-L-d_Er2
./dir5/Fo-L-d_Er3
./dir5/Fo-L-d_Er3/linuX_Test
./dir5/FiLE1
./dir5/FiLE2
./dir5/FiLE3
./dir5/FiLE4
./010.c

كما ترون بالنتيجة.الأداة بحث عن جميع الملفات.إذا أردنا أن نبحث فقط عن الملفات دون المجلدات.نطبق الآتي :

find . -type f

لاحقة f تحدد نوع الملفات و هي f(files)

لنبحث عن المجلدات نضع لاحقة d و هي إختصار لكلمة مجلد directory .

find . -type d
.
./dir1
./dir2
./dir2/{D1..D5}
./dir3
./dir3/{D1..D5}
./dir4
./dir4/{D1..D5}
./dir5
./dir5/{D1..D5}
./dir5/Fo-L-d_Er1
./dir5/Fo-L-d_Er2
./dir5/Fo-L-d_Er3

و لنبحث عن ملف معين.نضع لاحقة name- لتحديد إسم الملف.مثال:

find . -type f -name "file1"
./dir5/file1

بهذا المثال بحثنا عن ملف file1.و لكن يوجد بنفس المسار ملف آخر يحمل نفس الإسم و لكن فقط بحروف كبيرة.لتجاوز هذه المشكل و جعل find تعطينا جميع الملفات سواء حروف صغيرة أو كبيرة.نستخدم لاحقة iname- و حرف i إختصار لجملة case-insensative أو شيء مثل هذا.
مثال:

find . -type f -iname "file1"
./dir5/FiLE1
./dir5/file1

و لكي نبحث عن ملف ينتهي بصيغة معينة.نطبق هذه الحيلة و هي إضافة أحد رموز التعابير النمطية* و يفيد أي شيء. و في هذا المثال :

find . -type f -name "*.pdf"
./AnotherPdf.pdf
./001.pdf
./002.pdf
./003.pdf
./005.pdf
./006.pdf
./007.pdf
./008.pdf
./009.pdf
./010.pdf
./dir1/001.pdf
./dir1/002.pdf
./dir1/003.pdf
./dir1/004.pdf
./dir1/005.pdf
./dir1/006.pdf
./dir1/007.pdf
./dir1/008.pdf
./dir1/009.pdf
./dir1/010.pdf

كما يمكننا أيضا البحث عن المجلدات.

find . -type d -name "dir*"
./dir1
./dir2
./dir3
./dir4
./dir5

و لنبحث عن ملفات حسب وقت التعديل . نقوم بالتالي:

 
find . -type f -mmin -10

بهذا المثال الأداة ستبحث عن ملفات :
-type f
تم التعديل عليها في أقل من عشر دقائق
-mmin -10

-m modified
min minutes
-10 less than 10 min أقل من عشر دقائق

و يمكننا القيام بالعكس.البحث عن الملفات التي تم التعديل على في أكثر من عشر دقائق

find . -type f -mmin +10

كما يمكننا البحث بين توقيتين . مثال :

find . -type f -mmin +10 -mmin -30

بهذا المثال سنبحث عن الملفات التي تم التعديل عليها في أكثر من عشر دقائق و أقل من نصف ساعة.

*** كما يمكننا عوض البحث بإستخدام الدقائق فقط. نستخدم يوم أو أيام . و ذلك بإستخدام لاحقة mtime- .أمثلة :

بهذا المثال نبحث عن الملفات التي تم التعديل عليها في أقل من يوم.

find . -type f -mtime +1

في أكثر من يوم.

find . -type f -mtime +1 -mtime -20

بهذا المثال نبحث عن الملفات التي تم تعديلها في أكثر من يوم و أقل من عشرين يوم.

كما يمكننا إستخدام خاصية amin- atime- .و هي متعلقة بوقت دخول الملف إذا كن فهمي صحيح acces time .
و إستخدام أيضا cmin- و ctime- .و هي مرتبطة بتوقيت تغير أو التعديل على الملف change time.

  • ويمكننا أيضا البحث عن الملفات بتحدد الحجم من كيلوباي أو ميجابايت أو جيجابايت . أمثلة :
 find . -type f -size -30M           
./001.jpg
./002.jpg
./003.jpg
./004.jpg
./005.jpg
./AnotherPdf.pdf
./AuD12345io.mp3
./001.mp3
./003.mp3
./004.mp3
./005.mp3
./006.mp3
./007.mp3
./008.mp3
./009.mp3
./010.mp3
./001.pdf
./002.pdf
./003.pdf
./005.pdf
./006.pdf
./007.pdf
./008.pdf
./009.pdf
./010.pdf
./dir1/001.pdf
./dir1/002.pdf
./dir1/003.pdf
./dir1/004.pdf
./dir1/005.pdf
./dir1/006.pdf
./dir1/007.pdf
./dir1/008.pdf
./dir1/009.pdf
./dir1/010.pdf
./dir2/001.txt
./dir2/002.txt
./dir2/003.txt
./dir2/004.txt
./dir2/005.txt
./dir2/006.txt
./dir2/007.txt
./dir2/008.txt
./dir2/009.txt
./dir2/010.txt
./dir3/001.c
./dir3/002.c
./dir3/003.c
./dir3/004.c
./dir3/005.c
./dir3/006.c
./dir3/007.c
./dir3/008.c
./dir3/009.c
./dir3/010.c
./dir5/Fo-L-d_Er3/linuX_Test
./dir5/FiLE1
./dir5/FiLE2
./dir5/FiLE3
./dir5/FiLE4
./dir5/file1
./dir5/file2
./dir5/file3
./010.c
./LCBT_AwkSed_006_Sed_Scripts.mov

بهذا المثال قمنا بالبحث عن الملفات التي حجمها أقل من ثلاثون ميجابايت .

find . -type f -size +30M          
./1.Python_basics.7z
./LCBT_AwkSed_003_Sed_Intro.mov

أكثر من ثلاثون ميجابايت.

find . -type f -size +20M -size -40M
./1.Python_basics.7z
./LCBT_AwkSed_003_Sed_Intro.mov
./LCBT_AwkSed_006_Sed_Scripts.mov

ملفات حجمها أكثر من عشرون ميجابايت و أقل من أربعين ميجابايت.
لي تتمة حول الموضوع .و داخل نفس الموضوع على شكل رد أو ردين.

إعجاب واحد (1)

هذه تتمة للموضوع.

نضيف أمثلة حول خاصية البحث عن الملفات عن طريق لاحقة

-size

و تكمن أهميه هذه الخاصية عند إمتلاء القرص الصلب.تبحث عن الملفات الكبيرة الحجم . لتزيد من مساحة القرص .

لهذا يأتي دور و أهمية البحث عن حجم الملفات.

إذا أردنا البحث عن حجم اللفات بخاصية الميجابايت.نقوم بالتالي :

find -type f -size +20M

بهذا المثال سيتم البحث داخل جميع المسارات عن الملفات التي يفوق حجمها 20 ميجابايت.
مثال آخر :

find temp -type f -size +20M
temp/aous-find/1.Python_basics.7z
temp/aous-find/LCBT_AwkSed_003_Sed_Intro.mov
temp/aous-find/LCBT_AwkSed_006_Sed_Scripts.mov

بهذا المثال قمنا بالبحث داخل مجلد temp
عن الملفات التي يفوق حجمها 20 ميجابايت.

  • نقوم بالتأكد بتطبيق أمر
ls -lha temp/aous-find/LCBT*       
 -rw------- 1 u0_a499 u0_a499 37M Apr 16 03:26 temp/aous-find/LCBT_AwkSed_003_Sed_Intro.mov
-rw------- 1 u0_a499 u0_a499 28M Apr 16 03:27 temp/aous-find/LCBT_AwkSed_006_Sed_Scripts.mov

يمكننا أيضا إستخدام الحرف الصغير k للإشارة لحجم الكيلوبايت و أيضا الحرف الكبير G للإشارة لحجم الجيجابايت

find -size +2000k 
find -size -2G

يجب فقط تعلم فقط أساسيات كل خاصية.بعد ذلك يمكن لكم التلاعب بالخصائص كل مستخدم على حسب إحتياجاته.

و من المسائل التي نستطيع القيام بها البحث عن الملفات الفارغة على النظام و ذلك بإستخدام لاحقة

-empty

مثال :

find dir4 -empty
dir4/image001.jpg
dir4/image002.jpg
dir4/image003.jpg
dir4/image004.jpg
dir4/image005.jpg
dir4/image006.jpg
dir4/file.sh

بهذا المثال قمنا بالبحث عن جميع الملفات الفارغة داخل مجلد
dir4

find . -perm 777
./dir3/Project001.mpg           ./dir3/Project002.mpg
./dir3/Project003.mpg           ./dir3/Project004.mpg
./dir3/Project005.mpg           ./dir3/Project006.mpg

بهذا المثال قمنا بالحث عن جميع الملفات التي تحمل صلاحيات القراءة و الكتابة و التنفيذ
read/write/execute
rwx

لنتأكد من ذلك

ls -lha dir3/*
-rwxrwxrwx 1 u0_a499 u0_a499 0 Apr 17 04:45 dir3/Project001.mpg
-rwxrwxrwx 1 u0_a499 u0_a499 0 Apr 17 04:45 dir3/Project002.mpg     -rwxrwxrwx 1 u0_a499 u0_a499 0 Apr 17 04:45 dir3/Project003.mpg
-rwxrwxrwx 1 u0_a499 u0_a499 0 Apr 17 04:45 dir3/Project004.mpg
-rwxrwxrwx 1 u0_a499 u0_a499 0 Apr 17 04:45 dir3/Project005.mpg
-rwxrwxrwx 1 u0_a499 u0_a499 0 Apr 17 04:45 dir3/Project006.mpg

و هي كذلك.نفس الصلاحيات للمالك و المجموعة و باقي المستخدمين.

و لكي نستفيد أكثر من هذه الخاصية.يمكننا إستخدامها لتغير صلاحيات ملفات معينة .
لنقل أننا نريد تغير مالك و مجموعة بعض الملفات.
و مثل هذه العملية ستأخذ وقت و عمل يدويا. و لكن بإستخدام أداة البحث العملية سهلة.

find dir4 -exec chmod samir:tutor {} +

هذا الأمر سيقوم بتغير ملكية و مجموعة الملفات الموجودة بهذا المجلد
dir4

للبحث عن ملفات بصلاحيات معينة.نستخدم لاحقة
-perm
و هي إختصار لكلمة
permission

أمثلة

samir@localhost:~/temp$ find . -perm 644 
./F-1.txt                       
./F-2.txt                       
./F-3.txt                       
./dir1/Dr2/file1.txt            ./dir1/Dr2/file2.txt            ./dir1/Dr2/file3.txt            ./dir1/Dr2/file4.txt            ./dir1/Dr6/file1.txt            ./dir1/Dr6/file2.txt            ./dir1/Dr6/file3.txt            ./dir1/Dr6/file4.txt            ./dir1/Dr9/file1.txt            ./dir1/Dr9/file2.txt            ./dir1/Dr9/file3.txt            ./dir1/Dr9/file4.txt            ./dir8/Dr2/file1.txt            ./dir8/Dr2/file2.txt            ./dir8/Dr2/file3.txt            ./dir8/Dr2/file4.txt            ./dir8/Dr6/file1.txt            ./dir8/Dr6/file2.txt            ./dir8/Dr6/file3.txt            ./dir8/Dr6/file4.txt            ./dir8/Dr9/file1.txt            ./dir8/Dr9/file2.txt            ./dir8/Dr9/file3.txt            ./dir8/Dr9/file4.txt            samir@localhost:~/temp$

بهذا المثال قمنا بالبحث داخل المسار الحالي عن جميع الملفات التي تحمل صلاحيات القراءة و الكتابة للمالك و صلاحيات القراءة للمجموعة و صلاحيات القراءة لباقي المستخدمين

rw-r-r
6-4-4
(4-2)-4-4
(r-w)-r-r

لنقل أننا نريد تغير صلاحيات ملفات دون غيرها

مثال

samir@localhost:~/temp$ find ./dir8/Dr9 -perm 644                                 
./dir8/Dr9/file1.txt          
./dir8/Dr9/file2.txt            
./dir8/Dr9/file3.txt            
./dir8/Dr9/file4.txt   

**الأمر السابق تأكدنا من صلاحيات الملفات أنها
٦٤٤

samir@localhost:~/temp$ find ./dir8/Dr9 -perm 644 -exec chmod 766 {} + 

**بعد ذلك هنا قمنا بالبحث داخل المسار
/dir8/Dr9
عن جميع الملفات الموجودة بصلاحيات ٦٤٤ ثم قمنا بتغيرها إلى ٧٦٦

samir@localhost:~/temp$ find ./dir8/Dr9 -perm 644  

هنا تأكدنا هل توجد أي ملفات بصلاحيات ٦٤٤
لاتوجد يعني أنه تم تغيرها

samir@localhost:~/temp$ find ./dir8/Dr9 -perm 766                                
 ./dir8/Dr9/file1.txt          
./dir8/Dr9/file2.txt            
./dir8/Dr9/file3.txt            
./dir8/Dr9/file4.txt            samir@localhost:~/temp$

هنا دليل على وجود ملفات بصلاحيات ٧٦٦

samir@localhost:~/temp$ find ./dir8/Dr9 -perm 766 -exec ls -l {} +                
-rwxrw-rw- 1 samir samir 0 Apr 18 03:59 ./dir8/Dr9/file1.txt    
-rwxrw-rw- 1 samir samir 0 Apr 18 03:59 ./dir8/Dr9/file2.txt    
-rwxrw-rw- 1 samir samir 0 Apr 18 03:59 ./dir8/Dr9/file3.txt    
-rwxrw-rw- 1 samir samir 0 Apr 18 03:59 ./dir8/Dr9/file4.txt

نتيجة أخرى تأكد ذلك

من المسائل الجميلة التي نستطيع القيام بها.البحث عن الملفات و حذفها في نفس الوقت

أمثلة

samir@localhost:~/temp$ ls dir4/Dr* dir4/Dr2:               file1.txt  

file3.txt           file2.txt  file4.txt                                         dir4/Dr6:                       file1.txt  file3.txt            file2.txt  file4.txt                                            dir4/Dr9:                       file1.txt  file3.txt            file2.txt  file4.txt
samir@localhost:~/temp$ rm $(find dir4 -name "*.txt")    

سنقوم بحذف جميع الملفات النصية الموجودة داخل مجلدdir4
*.txt
ستقوم بحذف أي ملف ينتهي بصيغة txt

samir@localhost:~/temp$ ls dir4/Dr*      
dir4/Dr2:                                                       
dir4/Dr6:                                                       
dir4/Dr9:                       
samir@localhost:~/temp$

بهذا المثال السابق طريقة مختلفة لتنسيق أداة البحث مع أداة الحذف.كأننا نقول لأمر
rm .
قم بحذف ناتج الأمر الموجود بين قوسين.

نقوم بعمل ملفات لتطبيق طريقة
-exec
أيضا

samir@localhost:~/temp$ touch dir4/Dr{2,6,9}/file{1..4}.txt                       samir@localhost:~/temp$ ls dir4/Dr*      
dir4/Dr2:                   file1.txt  file3.txt            file2.txt  file4.txt                                            dir4/Dr6:                       file1.txt  file3.txt            file2.txt  file4.txt                                            dir4/Dr9:                       file1.txt  file3.txt            file2.txt  file4.txt            samir@localhost:~/temp$
samir@localhost:~/temp$ find dir4 -name "*.txt"                             
dir4/Dr2/file1.txt              dir4/Dr2/file2.txt              dir4/Dr2/file3.txt              dir4/Dr2/file4.txt              dir4/Dr6/file1.txt              dir4/Dr6/file2.txt              dir4/Dr6/file3.txt              dir4/Dr6/file4.txt              dir4/Dr9/file1.txt              dir4/Dr9/file2.txt              dir4/Dr9/file3.txt              dir4/Dr9/file4.txt
samir@localhost:~/temp$ find dir4 -name "*.txt" -exec rm {} +  

شرح للأمر السابق .نبحث داخل مجلد
dir4
عن أي ملف ينتهي بصيغة
txt
ثم نقوم بتنفيد أمر
rm
ليقوم بحذف أي ملف يجد.
هذا الرمز
{}
مكان مؤقت لحفظ أسماء الملفات التي ستجدها أداة البحث.
و هذا الرمز

لنحدد نهاية العملية ككل

samir@localhost:~/temp$ ls dir4/Dr*      
dir4/Dr2:                                                       dir4/Dr6:                                                       dir4/Dr9:                       samir@localhost:~/temp$

هنا تأكيد أن الملفات تم حذفها.

كما يمكننا حذف ملفات مستخدم معين فقط

samir@localhost:~$ find temp/dir8/ -user samir                                    temp/dir8/                    temp/dir8/Dr2                   temp/dir8/Dr2/file1.txt         temp/dir8/Dr2/file2.txt         temp/dir8/Dr2/file3.txt         temp/dir8/Dr2/file4.txt         temp/dir8/Dr6                   temp/dir8/Dr6/file1.txt         temp/dir8/Dr6/file2.txt         temp/dir8/Dr6/file3.txt         temp/dir8/Dr6/file4.txt         temp/dir8/Dr9                   temp/dir8/Dr9/file1.txt         temp/dir8/Dr9/file2.txt         temp/dir8/Dr9/file3.txt         temp/dir8/Dr9/file4.txt         temp/dir8/file1.py              temp/dir8/file2.py              temp/dir8/file3.py              samir@localhost:~$

إذا أردنا حذف جميع الملفات التي يملكها المستخدم سمير

find temp/dir8/ -user samir -name "*.txt" -delete

أو الطريقة الأخرى

find temp/dir8/ -user samir -name "*.txt" -exec rm -rf \;

و من الخيارات الجميلة مع لاحقة
-exec
خصوصا فيما يتعلق بالحذف مع لاحقة
-rf
التي تعني حذف بدون تردد و لا تراجع.يعني أي ملفات مهمة ستضيع.

لهذا من الأفضل إستخدام

-ok

مكانها التي تقوم بنفس المهمة.فقط تعطيك خيار التأكيد .هل تريد حقا الحذف أم لا.

samir@localhost:~$ find temp/dir8/ -user samir -name "*.txt" -ok rm -rf \;        
< rm ... temp/dir8/Dr2/file1.txt > ? y   
< rm ... temp/dir8/Dr2/file2.txt > ? y   
< rm ... temp/dir8/Dr2/file3.txt > ? y   
< rm ... temp/dir8/Dr2/file4.txt > ? y   
< rm ... temp/dir8/Dr6/file1.txt > ?

فقط الطريقة ستكون متعبة إذا كانت ملفات كثيرة.لهذا الأفضل إستخدام
-exec
مع التأكد دائما من الملفات قبل الحذف

كما يمكن إستخدام أداة البحث مع التنسيق مع أداة
cpio
لنسخ محتوى المجلدات

samir@localhost:~/temp/dir4$ ls Dr2  Snd01.mp3  Snd04.mp3  file1.py      
Dr6  Snd02.mp3  Snd05.mp3  file2.py      
Dr9  Snd03.mp3  Snd06.mp3  file3.py

ملفات صوتية

samir@localhost:~/temp/dir4$ find .  -type f -name "*.mp3"  | cpio -pdumv ~/Directory/sound-files/                         /home/samir/Directory/sound-files//./Snd01.mp3                                    /home/samir/Directory/sound-files//./Snd02.mp3                                    /home/samir/Directory/sound-files//./Snd03.mp3                                    /home/samir/Directory/sound-files//./Snd04.mp3                                    /home/samir/Directory/sound-files//./Snd05.mp3                                    /home/samir/Directory/sound-files//./Snd06.mp3                                    0 blocks   

*قمنا بالبحث بالمجلد الحالي عن جميع الملفات التي تنتهي بصيغة
mp3
و توجيه النتيجة إلى أداة
cpio
التي ستقوم بنسخ كل الملفات التي وجدتها أداة البحث إلى المسار
~/Directory/sound-files/

samir@localhost:~/temp/dir4$ ls ~/Directory/sound-files/        Snd01.mp3  Snd03.mp3  Snd05.mp3 Snd02.mp3  Snd04.mp3  Snd06.mp3 samir@localhost:~/temp/dir4$

و هنا تأكدنا أن الملفات تم نسخها.
إلى هنا ينتهي الموضوع.

إعجابَين (2)

أداه رائعة ونحتاجها كل يوم كُنت في البداية أراها معقده لكن مع الممارسة تتغير النظرة
ينقص فقط أن ترفق المصدر :slight_smile:

ليست ترجمة حرفية من موضوع على الشبكة. معلومات أعرفها و أخرى من دليل الأداة و أخرى من فيديوهات متفرقة على يوتوب . لا توجد عبارة واحدة من أي موقع معين.
الموضوع لا يوجد على الشبكة لا بالعربية و لا بالإنجليزية :slight_smile:

بإمكانك الاستفادة من هذا المقال

جميل.بارك الله فيك
الشرح مرفوع على github .

اها … فهمت ظننت تخبأ المصادر :sweat_smile: لغرض في نفس يعقوب :sweat_smile: