הפקודה FIND
כדי לחפש טקסט במספר קבצים ממסמך הפקודות של Windows או קבצי באטץ', אפשר להשתמש בפקודה FIND, שהיתה קיימת כבר מימי MS DOS ועדיין זמינה ב-Windows 11. היא דומה לפקודת Unix grep
, אך אינה תומכת בביטויים רגולריים. אם ברצונך לחפש את המילה borogoves
בספרייה הנוכחית, עליך להשתמש בתחביר זה:
find "borogoves" *
שים לב שהכפתורים סביב התבנית חובה. אם אתה משתמש ב-PowerShell, עליך לכלול גם כפתורים:
find '"borogoves"' *
במקום הכוכבית (*
), אפשר לציין מסך קבצים כמו *.htm?
. הפקודה find
מציגה את שמות הקבצים שהיא סורקת, אפילו אם היא לא מוצאת תוצאות בקבצים אלה:
החיפוש הוא רגיש לגופיים כברירת מחדל, ולכן בדרך כלל יש להוסיף את המפתח /I
כדי להתייחס לאותיות גדולות וקטנות כשוות:
find /I "<a href=" *.htm
אם לא תציין את הקובץ שבו לחפש, find
יחכה לקלט טקסטי מ-stdin, כך שתוכל לזרום פלט מפקודה אחרת. לדוגמה, אפשר לרשום את כל הפקודות המעתיקות הנתמכות ב-Windows:
help | find /i "copy"
מפתח נוסף, /V
, מאפשר לך למצוא את כל השורות שאינן מכילות את התבנית, דומה לפקודת grep -v
.
בקבצי באטץ', אפשר להשתמש בעובדה שהפקודה find
מגדירה את קוד הפריצה (errorlevel) ל-1 אם התבנית לא נמצאה. לדוגמה, אפשר לבדוק אם המכשיר פועל על גרסת Windows בינונית או קיוביטית:
@echo off rem Based on KB556009 with some corrections reg Query "HKLM\Hardware\Description\System\CentralProcessor\0" /v "Identifier" | find /i "x86 Family" > nul if errorlevel 1 goto win64 echo 32-bit Windows goto :eof :win64 rem Could be AMD64 or ARM64 echo 64-bit Windows
הפקודה FINDSTR: חיפוש בביטויים רגולריים
אם אתה צריך לחפש אחת רגולרית, נסה את הפקודה FINDSTR
, שהוצגה ב-Windows XP. לפי סיבות היסטוריות, findstr
תומכת בתת-קבוצה מוגבלת של ביטויים רגולריים, כך שאפשר להשתמש רק באפקטים הביטויים הרגולריים הבאים:
- הנקודה
.
מתאימה לכל תו מלבד שורה חדשה ותווים ASCII מורחבים. - רשימת תווים
[abc]
מתאימה לכל אחד מהתווים המסופקים (a
,b
, אוc
). - טווחי רשימת תווים
[a-z]
מתאימים לכל אות מ-a
עדz
. - הכוכבית (
*
) מציינת שהתו הקודם יכול להתרחש פעמים אפס או יותר. - הסמלים
\<
ו-\>
מסמנים את תחילת ואת סוף המילה. - הכותרת (
^
) וסימן הדולר ($
) מציינים את תחילת שורה וסוף שורה. - הסימן הכפול (
\
) מבודד כל סמל מפלגה, מה שמאפשר לך למצוא תווים מילוליים. לדוגמה,\$
מוצא את סימן הדולר עצמו.
findstr אינה תומכת בקבוצות תווים (\d
), בחירה מרובה (|
), או חזרות אחרות (+
או {5}
).
התחביר הבסיסי הוא זהה לפקודת FIND
:
findstr "\<20[0-9][0-9]\>" *.htm
פקודה זו מוצאת את כל השנים המתחילות ב-2000 בקבצי .htm
של הספרייה הנוכחית. בדיוק כמו עם find
, השתמש במנהלת /I
עבור חיפוש בלתי תלוי בקיצור:
מגבלות ומוזרויות של FINDSTR
רשימות תווים [a-z]
תמיד בלתי תלויות בקיצור, כך ש-echo ABC | findstr "[a-z]"
מתאים.
התו הרווח פועל כתו מטאכריטר ההחלפה ב-findstr
, כך ששאילתת חיפוש כמו findstr "new shoes" *
תמצא את כל השורות המכילות או new
או shoes
. למרבה הצער, אין דרך לברוח את הרווח ולהשתמש בו כתו ממשי בביטוי רגולרי. לדוגמה, אין דרך למצוא שורות שמתחילות ברווח.
שגיאות תחביר בביטוי רגולרי מתעלמות. לדוגמה, findstr "[" *
יתאים לכל השורות המכילות את התו [
.
אם הקובץ מכיל סיומות שורה של Unix (LF), המטאכריטר $
אינו עובד נכון. אם השורה האחרונה של הקובץ חסרה סיומת שורה, findstr
לא יוכל למצוא אותה. לדוגמה, findstr "</html>$" *
לא יעבוד אם אין CR+LF אחרי </html>.
גרסאות מוקדמות של Windows היו מצויבות במגבלות על אורך השורה עבור find
ו-findstr
, כמו גם לפקודות אחרות. גרסאות מוקדמות של Windows הרחיקו את המגבלות אלה, כך שאין צורך לדאוג לגביהן יותר. ראה את השאלה ב-StackOverflow זו על מגבלות ובאגים של findstr
, במיוחד בגרסאות מוקדמות של Windows.
הפקודה findstr פועלת בדף הוראות OEM (MS DOS); משתנה הנקודה אינו מתאים לאף אחד מהתווים המורחבים של ASCII. כתוצאה מכך, הפקודה אינה מאוד שימושית עבור טקסט שאינו אנגלי. חוץ מזה, אין אפשרות לחפש תווים יוניקודה (UTF-8 או UTF-16).
מסקנה
אפשר ללמוד על שינויים אחרים על ידי הקלדת findstr /?
או find /?
. לדוגמה, השינויים הנוספים מאפשרים לך לחפש בתת-קבצים או להדפיס מספרי שורות. כמו כן, אפשר להתייעץ בהתיעוד הרשמי.
באופן כללי, הפקודות find
ו-findstr
מיושנות ומגיעות עם מספר פגמים ומגבלות שונים.
Source:
https://dzone.com/articles/search-from-the-windows-command-prompt