Ответ 1
ls -U
сделает ls без сортировки.
Мне нужно получить список каталогов, содержащий около 2 миллионов файлов, но когда я выполняю команду ls
, ничего не возвращается. Я ждал 3 часа. Я пробовал ls | tee directory.txt
, но похоже, что он вечен навсегда.
Я предполагаю, что сервер делает много сортировки inode. Есть ли способ ускорить команду ls
, чтобы просто получить список каталогов с именами каталогов? В настоящее время меня не интересуют размер, даты, разрешение и т.д.
ls -U
сделает ls без сортировки.
Попробуйте использовать:
find . -type f -maxdepth 1
Это будет только список файлов в каталоге, оставьте вне аргумент -type f
, если вы хотите просмотреть файлы и каталоги.
Это, вероятно, не очень полезный ответ, но если у вас нет find
, вы можете обойтись с tar
$ tar cvf /dev/null .
Мне говорят люди старше меня, что "в тот же день" однопользовательские и восстановительные среды были намного более ограниченными, чем сейчас. То, откуда приходит этот трюк.
Используя
ls -1 -f
примерно в 10 раз быстрее, и это легко сделать (я тестировал с 1 миллионом файлов, но у моей оригинальной проблемы было 6 800 000 000 файлов)
Но в моем случае мне нужно было проверить, содержит ли какой-то конкретный каталог более 10 000 файлов. Если было более 10 000 файлов, меня больше не интересует, сколько там файлов. Я просто брошу программу, чтобы она работала быстрее и не пыталась читать остальное по очереди. Если будет меньше 10 000, я напечатаю точную сумму. Скорость моей программы очень похожа на ls -1 -f, если вы указываете большее значение параметра, чем количество файлов.
Вы можете использовать мою программу find_if_more.pl в текущем каталоге, набрав:
find_if_more.pl 999999999
Если вам просто интересно, если файлов больше n, script завершит быстрее, чем ls -1 -f с очень большим количеством файлов.
#!/usr/bin/perl
use warnings;
my ($maxcount) = @ARGV;
my $dir = '.';
$filecount = 0;
if (not defined $maxcount) {
die "Need maxcount\n";
}
opendir(DIR, $dir) or die $!;
while (my $file = readdir(DIR)) {
$filecount = $filecount + 1;
last if $filecount> $maxcount
}
print $filecount;
closedir(DIR);
exit 0;
Вы можете перенаправить вывод и запустить процесс ls в фоновом режиме.
ls > myls.txt &
Это позволит вам продолжать свою деятельность во время ее работы. Это не заблокирует вашу оболочку.
Не знаете, какие опции предназначены для запуска ls и получения меньшего количества данных. Вы всегда можете запустить man ls
, чтобы проверить.
Этот вопрос кажется интересным, и я проходил несколько ответов, которые были опубликованы. Чтобы понять эффективность опубликованных ответов, я выполнил их на 2 миллиона файлов и нашел результаты, как показано ниже.
$ time tar cvf /dev/null . &> /tmp/file-count
real 37m16.553s
user 0m11.525s
sys 0m41.291s
------------------------------------------------------
$ time echo ./* &> /tmp/file-count
real 0m50.808s
user 0m49.291s
sys 0m1.404s
------------------------------------------------------
$ time ls &> /tmp/file-count
real 0m42.167s
user 0m40.323s
sys 0m1.648s
------------------------------------------------------
$ time find . &> /tmp/file-count
real 0m2.738s
user 0m1.044s
sys 0m1.684s
------------------------------------------------------
$ time ls -U &> /tmp/file-count
real 0m2.494s
user 0m0.848s
sys 0m1.452s
------------------------------------------------------
$ time ls -f &> /tmp/file-count
real 0m2.313s
user 0m0.856s
sys 0m1.448s
------------------------------------------------------
Подводя итог результатам
ls -f
выполнялась быстрее, чем ls -U
. Это может привести к отключению цвета.
Команда find
заняла третье место со средней скоростью 2,738 секунды.ls
занял 42,16 секунды. Здесь в моей системе ls
есть псевдоним для ls --color=auto
echo ./*
выполнялось в течение 50.80 секунд.tar
заняло около 37 миллионов.Все тесты проводились отдельно, когда система находилась в режиме ожидания.
Важно отметить, что списки файлов в терминале скорее не печатаются
они были перенаправлены в файл, и количество файлов было рассчитано позже с помощью команды wc
.
Команды выполнялись слишком медленно, если выходы, напечатанные на экране.
Любые идеи, почему это происходит?
У меня есть каталог с 4 миллионами файлов в нем, и единственный способ получить ls, чтобы выплескивать файлы сразу без большого взрыва, - это
ls -1U
Я предполагаю, что вы используете GNU ls? попробуйте
\ls
Это будет унифицировать обычный ls (ls --color = auto).
Если процесс "не возвращается", я рекомендую strace проанализировать, как процесс взаимодействует с операционной системой.
В случае ls:
$strace ls
вы бы увидели, что он читает все записи каталога (getdents (2)), прежде чем он что-то выведет. (сортировка... как уже упоминалось здесь)
Как насчет find ./ -type f
(который найдет все файлы в текущем каталоге)? Снимите -type f
, чтобы найти все.
Что нужно попробовать:
Проверить ls не псевдонимом?
alias ls
Возможно, попробуйте найти вместо этого?
find . \( -type d -name . -prune \) -o \( -type f -print \)
Надеюсь, что это поможет.
Некоторые последующие действия: Вы не указываете, на какой ОС вы работаете, что поможет указать, какую версию ls вы используете. Вероятно, это не вопрос "bash", как вопрос. Я предполагаю, что вы используете GNU ls, у которого есть некоторые функции, которые полезны в некоторых контекстах, но убивают вас в больших каталогах.
GNU ls Попытка иметь более красивое расположение столбцов. GNU ls пытается сделать умное расположение всех имен файлов. В огромном каталоге это займет некоторое время и память.
Чтобы исправить это, вы можете попробовать:
ls -1
# нет столбцов вообще
найдите BSD ls someplace, http://www.freebsd.org/cgi/cvsweb.cgi/src/bin/ls/ и используйте это в своих больших каталогах.
Используйте другие инструменты, такие как find
Это будет самый быстрый вариант AFAIK: ls -1 -f
.
-1
(Нет столбцов)-f
(Нет сортировки)Какой тип раздела вы используете?
Имея миллионы небольших файлов в одном каталоге, может быть хорошей идеей использовать JFS или ReiserFS, которые имеют лучшую производительность со многими небольшими файлами.
Вы должны предоставить информацию о том, какую операционную систему и тип используемой файловой системы. В некоторых вариантах UNIX и некоторых файловых систем вы можете использовать команды ff
и ncheck
в качестве альтернативы.
Существует несколько способов получить список файлов:
Используйте эту команду для получения списка без сортировки:
ls -U
или отправьте список файлов в файл, используя:
ls /Folder/path > ~/Desktop/List.txt
Здесь много других хороших решений, но в интересах полноты:
echo *
Вы также можете использовать xargs. Просто подключите вывод ls через xargs.
ls | xargs
Если это не сработает и вышеприведенные примеры не работают, попробуйте подключить их к xargs, так как это может помочь в использовании памяти, которая может вызвать проблемы.