Рекурсивно читает папки и выполняет команды на каждой из них

EMails, такие как «адрес @ localhost» и «user@192.168.1.2», фактически являются действительными адресами, и вы можете протестировать их, запустив собственный почтовый сервер (обычно это делается путем изменения файла хоста). Однако для полного решения:

''' <summary>
''' METHODS FOR SENDING AND VALIDATING EMAIL
''' </summary>
''' <remarks></remarks>
Public Class email

    ''' <summary>
    ''' check if email format is valid
    ''' </summary>
    ''' <param name="emailAddress">[required] Email address.</param>
    ''' <param name="disallowLocalDomain">[optional] Allow headers like "@localhost"?</param>
    ''' <param name="allowAlerts">[optional] Enable error messages?</param>
    ''' <returns>Returns true if email is valid and false otherwise.</returns>
    ''' <remarks></remarks>
    Public Shared Function isValid(ByVal emailAddress As String,
                                   Optional ByVal disallowLocalDomain As Boolean = True,
                                   Optional ByVal allowAlerts As Boolean = True
                                   ) As Boolean
        Try
            Dim mailParts() As String = emailAddress.Split("@")
            If mailParts.Length <> 2 Then
                If allowAlerts Then
                    MsgBox("Valid email addresses are formatted [sample@domain.tld]. " &
                           "Your address is missing a header [i.e. ""@domain.tld""].",
                           MsgBoxStyle.Exclamation, "No Header Specified")
                End If
                Return False
            End If
            If mailParts(mailParts.GetLowerBound(0)) = "" Then
                If allowAlerts Then
                    MsgBox("Valid email addresses are formatted [sample@domain.tld]. " &
                           "The username portion of the e-mail address you provided (before the @ symbol) is empty.",
                           MsgBoxStyle.Exclamation, "Invalid Email User")
                End If
                Return False
            End If
            Dim headerParts() As String = mailParts(mailParts.GetUpperBound(0)).Split(".")
            If disallowLocalDomain AndAlso headerParts.Length < 2 Then
                If allowAlerts Then
                    MsgBox("Valid email addresses are formatted [sample@domain.tld]. " &
                           "Although addresses formatted like [sample@domain] are valid, " &
                           "only addresses with headers like ""sample.org"", ""sample.com"", and etc. " &
                           "[i.e. @domain.org] are accepted.",
                           MsgBoxStyle.Exclamation, "Invalid Header")
                End If
                Return False
            ElseIf headerParts(headerParts.GetLowerBound(0)) = "" Or
                   headerParts(headerParts.GetUpperBound(0)) = "" Then
                If allowAlerts Then
                    MsgBox("Valid email addresses are formatted [sample@domain.tld]. " &
                           "Your header """ & mailParts(mailParts.GetUpperBound(0)) & """ is invalid.",
                           MsgBoxStyle.Exclamation, "Invalid Header")
                End If
                Return False
            End If
            Dim address As MailAddress = New MailAddress(emailAddress)
        Catch ex As Exception
            If allowAlerts Then
                MsgBox(ex.Message, MsgBoxStyle.Exclamation, "Invalid Email Address")
            End If
            Return False
        End Try
        Return True
    End Function

End Class 'email'
21
задан CodeCaster 17 July 2012 в 11:38
поделиться

7 ответов

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

Эта команда может получать множество параметров, например type для фильтрации типов возвращаемых файлов или exec для выполнения команды для каждого результата.


Для Например, чтобы найти каталоги, которые находятся в том, в котором я сейчас нахожусь:

find . -type d -exec echo "Hello, '{}'" \;

Что даст мне что-то вроде:

Hello, '.'
Hello, './.libs'
Hello, './include'
Hello, './autom4te.cache'
Hello, './build'
Hello, './modules'


То же самое, чтобы найти файлы в текущем каталоге:

find . -type f -exec echo "Hello, '{}'" \;

, что даст мне что-то вроде этого:

Hello, './config.guess'
Hello, './config.sub'
Hello, './.libs/memcache_session.o'
Hello, './.libs/memcache_standard_hash.o'
Hello, './.libs/memcache_consistent_hash.o'
Hello, './.libs/memcache.so'
Hello, './.libs/memcache.lai'
Hello, './.libs/memcache.o'
Hello, './.libs/memcache_queue.o'
Hello, './install-sh'
Hello, './config.h.in'
Hello, './php_memcache.h'
...


Кто-то скажет: «Это не ракушка» ... Но зачем изобретать колесо заново?
(И, в некотором смысле, это оболочка ^^)


Для получения дополнительной информации вы можете взглянуть на:

48
ответ дан 29 November 2019 в 06:25
поделиться

Как-то так должно достичь вашей цели:

function RecurseDirs
{
    oldIFS=$IFS
    IFS=\n'
    for f in "$@"
    do
    -----your activity here-----
        if [[ -d "${f}" ]]; then
            cd "${f}"
            RecurseDirs $(ls -1 ".")
            cd ..
        fi
    done
    IFS=$oldIFS
}
7
ответ дан Zuul 17 July 2012 в 11:38
поделиться

Посмотрите на команду find и проверьте переключатели -type (используйте d, чтобы указать каталог) и -exec (чтобы указать команду для выполнения).

1
ответ дан Simon Groenewolt 17 July 2012 в 11:38
поделиться

Bash 4.0 представил опцию globstar, поэтому такая конструкция, как:

for f in mydir/**/*
do
  # operations here
done

... будет действовать рекурсивно на любых землях в $ f. Включите это с "shopt -s globstar", иначе ** будет рассматриваться как единственное число *.

Сегодня нашел этот драгоценный камень по адресу http://www.linuxjournal.com/content/globstar-new-bash-globbing-option , после того, как вдохновился конструкцией zsh (которую я включил по умолчанию). ).

9
ответ дан Trey Blancher 17 July 2012 в 11:38
поделиться

В некоторых базовых оболочках отсутствуют команды типа «найти», а некоторые из них не поддерживают рекурсивность. В этом случае вы можете использовать этот скрипт для запуска нужной команды во всех подкаталогах дерева:

CDIR=$(pwd)
for i in $(ls -R | grep :); do
    DIR=${i%:}                    # Strip ':'
    cd $DIR
    $1                            # Your command
    cd $CDIR
done

Если вы назвали вышеупомянутый «recurse.sh», тогда используйте:

./recurse.sh <command>

Пример (изменить владельца / группу на «корень» всех файлов в дереве):

./recurse.sh "chown 0:0 *"
4
ответ дан Paolo Santos 17 July 2012 в 11:38
поделиться

Для большинства рекурсивных файловых операций вы хотите использовать find, как объясняют другие ответы.

Существует пример рекурсивного скрипта bash, включенного в пакет bash-doc . Если у вас установлены эти примеры, это будет в /usr/share/doc/bash/examples/functions/recurse (в Debian).

0
ответ дан ire_and_curses 17 July 2012 в 11:38
поделиться

Извините, я не понимаю, о чем вы спрашиваете. Лучшее, что я могу догадаться по вашему вопросу:

find -type d -exec scriptname.sh \{\} \;
2
ответ дан 29 November 2019 в 06:25
поделиться