Подтвердить что ты не робот

Команда Quick ls

Мне нужно получить список каталогов, содержащий около 2 миллионов файлов, но когда я выполняю команду ls, ничего не возвращается. Я ждал 3 часа. Я пробовал ls | tee directory.txt, но похоже, что он вечен навсегда.

Я предполагаю, что сервер делает много сортировки inode. Есть ли способ ускорить команду ls, чтобы просто получить список каталогов с именами каталогов? В настоящее время меня не интересуют размер, даты, разрешение и т.д.

4b9b3361

Ответ 1

ls -U

сделает ls без сортировки.

Ответ 2

Попробуйте использовать:

find . -type f -maxdepth 1

Это будет только список файлов в каталоге, оставьте вне аргумент -type f, если вы хотите просмотреть файлы и каталоги.

Ответ 3

Это, вероятно, не очень полезный ответ, но если у вас нет find, вы можете обойтись с tar

$ tar cvf /dev/null .

Мне говорят люди старше меня, что "в тот же день" однопользовательские и восстановительные среды были намного более ограниченными, чем сейчас. То, откуда приходит этот трюк.

Ответ 4

Используя

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;

Ответ 5

Вы можете перенаправить вывод и запустить процесс ls в фоновом режиме.

ls > myls.txt &

Это позволит вам продолжать свою деятельность во время ее работы. Это не заблокирует вашу оболочку.

Не знаете, какие опции предназначены для запуска ls и получения меньшего количества данных. Вы всегда можете запустить man ls, чтобы проверить.

Ответ 6

Этот вопрос кажется интересным, и я проходил несколько ответов, которые были опубликованы. Чтобы понять эффективность опубликованных ответов, я выполнил их на 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. Команды выполнялись слишком медленно, если выходы, напечатанные на экране.

Любые идеи, почему это происходит?

Ответ 7

У меня есть каталог с 4 миллионами файлов в нем, и единственный способ получить ls, чтобы выплескивать файлы сразу без большого взрыва, - это

ls -1U

Ответ 8

Я предполагаю, что вы используете GNU ls? попробуйте

\ls

Это будет унифицировать обычный ls (ls --color = auto).

Ответ 9

Если процесс "не возвращается", я рекомендую strace проанализировать, как процесс взаимодействует с операционной системой.

В случае ls:

$strace ls

вы бы увидели, что он читает все записи каталога (getdents (2)), прежде чем он что-то выведет. (сортировка... как уже упоминалось здесь)

Ответ 10

Как насчет find ./ -type f (который найдет все файлы в текущем каталоге)? Снимите -type f, чтобы найти все.

Ответ 11

Что нужно попробовать:

Проверить ls не псевдонимом?

alias ls

Возможно, попробуйте найти вместо этого?

find . \( -type d -name . -prune \) -o \( -type f -print \)

Надеюсь, что это поможет.

Ответ 12

Некоторые последующие действия: Вы не указываете, на какой ОС вы работаете, что поможет указать, какую версию ls вы используете. Вероятно, это не вопрос "bash", как вопрос. Я предполагаю, что вы используете GNU ls, у которого есть некоторые функции, которые полезны в некоторых контекстах, но убивают вас в больших каталогах.

GNU ls Попытка иметь более красивое расположение столбцов. GNU ls пытается сделать умное расположение всех имен файлов. В огромном каталоге это займет некоторое время и память.

Чтобы исправить это, вы можете попробовать:

ls -1 # нет столбцов вообще

найдите BSD ls someplace, http://www.freebsd.org/cgi/cvsweb.cgi/src/bin/ls/ и используйте это в своих больших каталогах.

Используйте другие инструменты, такие как find

Ответ 13

Это будет самый быстрый вариант AFAIK: ls -1 -f.

  • -1 (Нет столбцов)
  • -f (Нет сортировки)

Ответ 14

Какой тип раздела вы используете?

Имея миллионы небольших файлов в одном каталоге, может быть хорошей идеей использовать JFS или ReiserFS, которые имеют лучшую производительность со многими небольшими файлами.

Ответ 15

Вы должны предоставить информацию о том, какую операционную систему и тип используемой файловой системы. В некоторых вариантах UNIX и некоторых файловых систем вы можете использовать команды ff и ncheck в качестве альтернативы.

Ответ 16

Существует несколько способов получить список файлов:

Используйте эту команду для получения списка без сортировки:

ls -U

или отправьте список файлов в файл, используя:

ls /Folder/path > ~/Desktop/List.txt

Ответ 17

Здесь много других хороших решений, но в интересах полноты:

echo *

Ответ 18

Вы также можете использовать xargs. Просто подключите вывод ls через xargs.

ls | xargs

Если это не сработает и вышеприведенные примеры не работают, попробуйте подключить их к xargs, так как это может помочь в использовании памяти, которая может вызвать проблемы.