Я присоединяюсь к этому очень поздно, но нашел что-то более интересное.
Таким образом, мы можем использовать здесь 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
Чтобы проверить, существует ли каталог в сценарии оболочки, можно использовать следующее:
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 в другом ответе .
, Если переменные содержат пробелы или другие необычные символы, это, вероятно, заставит сценарий перестать работать.
Отметьте , тест-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 и [
встроенная команда и [[
составная команда .
Более короткая форма:
[ -d "$DIR" ] && echo "Yes"
Я нахожу двойная скобка , версия test
делает тесты логики записи более естественными:
if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
echo "It's a bona-fide directory"
fi
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
Не забудьте всегда обертывать переменные в двойные кавычки при ссылке на них в сценарии удара. Дети в эти дни растут с идеей, что у них могут быть пробелы и много других забавных символов в их именах каталогов. (Пробелы! Назад в мои дни, у нас не было необычных пробелов!;))
Однажды, один из тех детей выполнит Ваш сценарий с $DIRECTORY
, набор к "My M0viez"
и Ваш сценарий аварийно завершится. Вы не хотите это. Так используйте это.
if [ -d "$DIRECTORY" ]; then
# Will enter here if $DIRECTORY exists, even if it contains spaces
fi
Или для чего-то совершенно бесполезного:
[ -d . ] || echo "No"
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), выгода больше, чем беда.
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
if [ -d "$Directory" -a -w "$Directory" ]
then
#Statements
fi
Приведенный выше код проверяет, существует ли каталог и доступен ли он для записи.
Так же, как альтернатива' [-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