В bash, как я могу напечатать первые n элементов списка? - PullRequest
10 голосов
/ 20 мая 2009

В bash, как я могу напечатать первые n элементы списка?

Например, первые 10 файлов в этом списке:

FILES=$(ls)

ОБНОВЛЕНИЕ: Я забыл сказать, что хочу напечатать элементы в одну строку, так же, как когда вы печатаете весь список с помощью echo $FILES.

Ответы [ 8 ]

24 голосов
/ 20 мая 2009
FILES=(*)
echo "${FILES[@]:0:10}"

Должно работать правильно, даже если в именах файлов есть пробелы.

FILES=$(ls) создает строковую переменную. FILES=(*) создает массив. Смотрите эту страницу для примеров использования массивов в bash . (спасибо lhunath)

5 голосов
/ 25 августа 2011
FILE="$(ls | head -1)"

Правильно обрабатывал пробелы в именах файлов, когда я пытался это сделать.

4 голосов
/ 18 января 2012

Почему бы не распечатать первые 50 файлов:

ls -1 | head -50
3 голосов
/ 10 июня 2013

Мой путь будет:

ls | head -10 | tr "\n" " "

Это напечатает первые 10 строк, возвращаемых ls, а затем tr заменяет все разрывы строк пробелами. Вывод будет в одну строку.

2 голосов
/ 21 мая 2009
echo $FILES | awk '{for (i = 1; i <= 10; i++) {print $i}}'

Редактировать: Ааа, пропустил ваш комментарий, что они вам нужны в одной строке ...

echo $FILES | awk '{for (i = 1; i <= 10; i++) {printf "%s ", $i}}'

Тот делает это.

1 голос
/ 21 мая 2009

, чтобы сделать это в интерактивном режиме:

set $FILES && eval eval echo \\\${1..10}

чтобы запустить его как скрипт, создайте foo.sh с содержимым

N=$1; shift; eval eval echo \\\${1..$N}

и запустите его как

bash foo.sh 10 $FILES

0 голосов
/ 19 августа 2018

Дополнение к ответам «Айман Хуриех» и «Шон Чин», если оно необходимо для чего-то другого, кроме содержимого каталога.

В более новой версии bash вы можете использовать mapfile для хранения каталога в массиве. Смотри help mapfile

mapfile -t files_in_dir < <( ls )

Если вы хотите полностью использовать bash, используйте printf "%s\n" * вместо ls или просто замените ls любой другой необходимой вам командой.

Теперь вы можете обращаться к массиву как обычно и получать необходимые данные.

Первый элемент:

${files_in_dir[0]}

Последний элемент (не забывайте пробел после ":"):

${files_in_dir[@]: -1}

Диапазон, например с 10 до 20:

${files_in_dir[@]:10:20}

Внимание для больших каталогов , это намного больше памяти, чем другие решения.

0 голосов
/ 20 мая 2009
FILES=$(ls)
echo $FILES | fmt -1 | head -10
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...