Расширение каталогов для включения пробелов в Bash - PullRequest
1 голос
/ 10 марта 2020

Я написал код для рекурсивного поиска слова в файловой системе и во всех ее подкаталогах. Хотя он работает по большей части, у него возникают проблемы с поиском папок, которые содержат пробелы, например, он найдет искомое слово в каталоге «Bash_Exercises», но не «Bash Exercises». Я знаю, что из курсов, которые я изучил в Bash, это как-то связано с использованием "" для распознавания всей строки, но независимо от того, где я поставил "", я не могу искать папки, в которых есть пробелы. во имя Я подумал, что упускаю из виду что-то такое маленькое, и просто хотел вторую пару глаз.

#! /bin/bash

# Navigate to the home directory

cd /Users/michael/desktop

# Ask for word to search

read -p "What word would you like to search for? " word
echo ""

#Find all directories

for i in $(find . -type d)

do

#In each directory execute the following

    #In each directory run a loop on all contents

    for myfile in "$i"/* ; 
    do

        #If myfile is a file, not a directory or a shell script, echo the file name and line number

        if [[ -f "$myfile" ]]; then

            #Store grep within the varible check

            check=$(grep -ni "$word" "$myfile")

            #Use an if to see if the variable "check" is empty, indicating the search word was not found

            if [[ -n $check ]]; then

                #If check is not empty, echo the folder location, the file name within the folder, and the line where the text shows up

                echo "File location: $myfile"
                echo "$check"
                echo ""
                echo "------------------------"
                echo ""

            fi

        fi

    done

done

Так же, как система координат, я очень новичок в Bash, все самоучки через онлайн-курсы , который может только так помочь, пока вы не попадаете в примеры, не связанные с курсом. Я ценю любую помощь.

1 Ответ

3 голосов
/ 10 марта 2020

для i in $ (find. -Type d)

Каждый раз, когда вы видите for i in $(...), наиболее вероятно, что вы делаете ошибку. Правильный способ перебирать список построчно - использовать время чтения l oop:

find . -type d | while IFS= read -r i; do
   : ....
done 

Но лучше использовать bash и нулевой завершенный список, если у вас есть символ новой строки в именах файлов:

find . -type d -print0 | while IFS= read -d '' -r i; do

Более подробную информацию можно найти на bashfaq о том, как читать строку построчно .

...