Проверьте, существует ли каталог в сценарии оболочки

Я присоединяюсь к этому очень поздно, но нашел что-то более интересное.

Таким образом, мы можем использовать здесь Skip и Take для лучшей производительности.

public static class MyExtensions
    {
        public static IEnumerable<IEnumerable<T>> Batch<T>(this IEnumerable<T> items, int maxItems)
        {
            return items.Select((item, index) => new { item, index })
                        .GroupBy(x => x.index / maxItems)
                        .Select(g => g.Select(x => x.item));
        }

        public static IEnumerable<T> Batch2<T>(this IEnumerable<T> items, int skip, int take)
        {
            return items.Skip(skip).Take(take);
        }

    }

Далее я проверил 100000 записей. Зацикливание занимает больше времени в случае Batch

Code of console application.

static void Main(string[] args)
{
    List<string> Ids = GetData("First");
    List<string> Ids2 = GetData("tsriF");

    Stopwatch FirstWatch = new Stopwatch();
    FirstWatch.Start();
    foreach (var batch in Ids2.Batch(5000))
    {
        // Console.WriteLine("Batch Ouput:= " + string.Join(",", batch));
    }
    FirstWatch.Stop();
    Console.WriteLine("Done Processing time taken:= "+ FirstWatch.Elapsed.ToString());


    Stopwatch Second = new Stopwatch();

    Second.Start();
    int Length = Ids2.Count;
    int StartIndex = 0;
    int BatchSize = 5000;
    while (Length > 0)
    {
        var SecBatch = Ids2.Batch2(StartIndex, BatchSize);
        // Console.WriteLine("Second Batch Ouput:= " + string.Join(",", SecBatch));
        Length = Length - BatchSize;
        StartIndex += BatchSize;
    }

    Second.Stop();
    Console.WriteLine("Done Processing time taken Second:= " + Second.Elapsed.ToString());
    Console.ReadKey();
}

static List<string> GetData(string name)
{
    List<string> Data = new List<string>();
    for (int i = 0; i < 100000; i++)
    {
        Data.Add(string.Format("{0} {1}", name, i.ToString()));
    }

    return Data;
}

Записанное время Это как.

Сначала - 00: 00: 00.0708, 00: 00: 00.0660

Второе (выберите и пропустите) - 00: 00: 00.0008, 00: 00: 00.0008

3477
задан Jahid 17 December 2015 в 09:18
поделиться

11 ответов

Чтобы проверить, существует ли каталог в сценарии оболочки, можно использовать следующее:

if [ -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY exists.
fi

Или проверять, не существует ли каталог:

if [ ! -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY doesn't exist.
fi
<час>

Однако как Jon Ericson указывает, последующие команды не могут работать, как предназначено, если Вы не принимаете во внимание, что символьная ссылка на каталог также передаст эту проверку. Например, выполнение этого:

ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then 
  rmdir "$SYMLINK" 
fi

произведет сообщение об ошибке:

rmdir: failed to remove `symlink': Not a directory

, Таким образом, символьные ссылки, вероятно, придется рассматривать по-другому, если последующие команды ожидают каталоги:

if [ -d "$LINK_OR_DIR" ]; then 
  if [ -L "$LINK_OR_DIR" ]; then
    # It is a symlink!
    # Symbolic link specific commands go here.
    rm "$LINK_OR_DIR"
  else
    # It's a directory!
    # Directory command goes here.
    rmdir "$LINK_OR_DIR"
  fi
fi
<час>

Обращают особое внимание на двойные кавычки, используемые для обертывания переменных, причина этого объяснена 8jean в другом ответе .

, Если переменные содержат пробелы или другие необычные символы, это, вероятно, заставит сценарий перестать работать.

4858
ответ дан Zoe 17 December 2015 в 09:18
поделиться

Отметьте , тест-d может привести к некоторым неожиданным результатам:

$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory

Файл под: "Когда каталог не является каталогом?" Ответ: "Когда это - символьная ссылка на каталог". Немного более полный тест:

if [ -d t ]; then 
   if [ -L t ]; then 
      rm t
   else 
      rmdir t
   fi
fi

можно найти больше информации в руководстве Bash по условные выражения Bash и [ встроенная команда и [[ составная команда .

218
ответ дан Jonathan Leffler 17 December 2015 в 09:18
поделиться
  • 1
    I' ve та же версия. CTRL+TAB просто циклы через все вкладки (стиль Chrome) вместо того, чтобы переключиться между текущей и предыдущей вкладкой. – geca 10 April 2014 в 13:51

Более короткая форма:

[ -d "$DIR" ] && echo "Yes"
146
ответ дан Jahid 17 December 2015 в 09:18
поделиться

Я нахожу двойная скобка , версия test делает тесты логики записи более естественными:

if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
    echo "It's a bona-fide directory"
fi
208
ответ дан Jacob 17 December 2015 в 09:18
поделиться

Больше функций с помощью find

  • существование Проверки папки в подкаталогах:

    found=`find -type d -name "myDirectory"`
    if [ -n "$found"]
    then
        # The variable 'found' contains the full path where "myDirectory" is.
        # It may contain several lines if there are several folders named "myDirectory".
    fi
    
  • существование Проверки одной или нескольких папок на основе шаблона в текущем каталоге:

    found=`find -maxdepth 1 -type d -name "my*"`
    if [ -n "$found"]
    then
        # The variable 'found' contains the full path where folders "my*" have been found.
    fi
    
  • Обе комбинации. В следующем примере это проверяет существование папки в текущем каталоге:

    found=`find -maxdepth 1 -type d -name "myDirectory"`
    if [ -n "$found"]
    then
        # The variable 'found' is not empty => "myDirectory"` exists.
    fi
    
20
ответ дан Peter Mortensen 17 December 2015 в 09:18
поделиться

Не забудьте всегда обертывать переменные в двойные кавычки при ссылке на них в сценарии удара. Дети в эти дни растут с идеей, что у них могут быть пробелы и много других забавных символов в их именах каталогов. (Пробелы! Назад в мои дни, у нас не было необычных пробелов!;))

Однажды, один из тех детей выполнит Ваш сценарий с $DIRECTORY, набор к "My M0viez" и Ваш сценарий аварийно завершится. Вы не хотите это. Так используйте это.

if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists, even if it contains spaces
fi
507
ответ дан cafebabe1991 17 December 2015 в 09:18
поделиться

Или для чего-то совершенно бесполезного:

[ -d . ] || echo "No"
55
ответ дан 17 December 2019 в 16:00
поделиться

sub foo
{
    my $params = $_[0];
    my %hash = %$params;
        foreach $keys (keys %hash)
        {
         print $keys;
        }
}

my $hash_ref = {name => 'Becky', age => 23};

foo($hash_ref);

Также хорошее введение о ссылках здесь .

-121--4349355-

Попробуйте pyqver: https://github.com/ghewgill/pyqver/

Предоставляет минимальную версию для данного скрипта python, анализируя используемые ключевые слова и модули.

Также можно скомпилировать локально python 2.2 и использовать virtualenv для создания среды python 2.2 с флагом --python.

-121--2470074-

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

DIR_PATH=`readlink -f "${the_stuff_you_test}"` # Get rid of symlinks and get abs path
if [[ -d "${DIR_PATH}" ]] ; Then # now you're testing
    echo "It's a dir";
fi

Не нужно беспокоиться о местах и специальных символов, пока вы используете «$ {}» .

Обратите внимание, что [[]] не так переносим, как [], но поскольку большинство людей работает с современными версиями Bash (так как в конце концов, большинство людей даже не работает с командной строкой: -p), выгода больше, чем беда.

20
ответ дан 17 December 2019 в 16:00
поделиться
if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists
fi

Это не совсем так ... Если вы хотите перейти в этот каталог, у вас также должны быть права на выполнение в этом каталоге. Возможно, вам также нужны права на запись.

Следовательно:

if [ -d "$DIRECTORY" ] && [ -x "$DIRECTORY" ] ; then
    # ... to go to that directory (even if DIRECTORY is a link)
    cd $DIRECTORY
    pwd
fi

if [ -d "$DIRECTORY" ] && [ -w "$DIRECTORY" ] ; then
    # ... to go to that directory and write something there (even if DIRECTORY is a link)
    cd $DIRECTORY
    touch foobar
fi
7
ответ дан 17 December 2019 в 16:00
поделиться
if [ -d "$Directory" -a -w "$Directory" ]
then
    #Statements
fi

Приведенный выше код проверяет, существует ли каталог и доступен ли он для записи.

36
ответ дан 17 December 2019 в 16:00
поделиться

Так же, как альтернатива' [-d]' и' [-h]' опции; можно использовать stat, чтобы получить тип файла и проанализировать его.

#! /bin/bash
MY_DIR=$1
NODE_TYPE=$(stat -c '%F' ${MY_DIR} 2>/dev/null)
case "${NODE_TYPE}" in
        "directory") echo $MY_DIR;;
    "symbolic link") echo $(readlink $MY_DIR);;
                 "") echo "$MY_DIR does not exist";;
                  *) echo "$NODE_TYPE is unsupported";;
esac
exit 0

Данные тестирования:

$ mkdir tmp
$ ln -s tmp derp
$ touch a.txt
$ ./dir.sh tmp
tmp
$ ./dir.sh derp
tmp
$ ./dir.sh a.txt
regular file is unsupported
$ ./dir.sh god
god does not exist
0
ответ дан 17 December 2019 в 16:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: