טיפ Bash: גלובינג רקורסיבי

19/10/2018

יש לכם bash גירסא 4? גם אתם יכולים להשתמש ב globstar שיגרום לתבניות הגלוב שלכם לתפוס יותר קבצים. בואו נראה מה זה ואיך מפעילים.

1. מה זה גלובינג רקורסיבי

נניח שיש לכם את מבנה הקבצים והתיקיות הבא:

    .
├── doc
│   └── readme.txt
├── lib
│   └── demo.c
└── src
    ├── common
    │   └── utils.c
    └── main.c

ואתם רוצים רשימה של פרטי כל הקבצים שמסתיימים ב .c. עד לא מזמן find היתה האופציה הטובה ביותר שלכם, מאחר ואתם לא יודעים באיזה תיקיות קבצים אלה מסתתרים.

גירסא 4 של Bash הוסיפה תמיכה בסימן ** בתבניות שמות קבצים. זה ההסבר על הסימן מתוך man bash:

          globstar If set, the pattern ** used in a pathname expansion context will  match  all  files  and zero  or  more  directories and subdirectories.  If the pattern is followed by a /, only directories and subdirectories match.

או בקיצור הסימן מתאים לחיפוש עומק בתיקיות והוא מייצג רצף של תיקיה בתוך תיקיה בתוך תיקיה לכל עומק אפשרי.

בדוגמא שלנו כדי לקבל את רשימת כל קבצי ה c נפעיל:

 $ ls -l **/*.c
 -rw-r--r--  1 ynonperek  staff  0 Oct 18 20:41 lib/demo.c
-rw-r--r--  1 ynonperek  staff  0 Oct 18 20:41 src/common/utils.c
-rw-r--r--  1 ynonperek  staff  0 Oct 18 20:41 src/main.c

2. למה זה לא עובד אצלי

לפני שאתם רצים לשלב גלוב רקורסיבי בסקריפטים שלכם יש לוודא שני דברים:

  1. אתם עובדים על Bash גירסא 4 או חדשה יותר. אפשר לבדוק את הגירסא עם:
$ echo $BASH_VERSION
  1. יש להפעיל את התמיכה באפשרות globstar כדי לא לשבור סקריפטים ישנים. אם אתם ב Shell אינטרקטיבי פשוט כותבים:
$ shopt -s globstar