2009-05-20 6 views
9

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

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

FILES=$(ls) 

UPDATE: Я забыл сказать, что я хочу, чтобы напечатать элементы на одной линии, так же, как при печати всего списка с echo $FILES.

+0

Я сделал небольшую поправку к моему решению. Он должен печатать все имена файлов в одной строке. Вы попробовали? –

+1

Пожалуйста, прочтите: http://mywiki.wooledge.org/ParsingLs. Важно понимать тонкости и ловушки bash, если вы хотите избежать бедствий в своих файлах. – lhunath

ответ

22
FILES=(*) 
echo "${FILES[@]:0:10}" 

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

FILES=$(ls) создает строковую переменную. FILES=(*) создает массив. См. Эту страницу для более examples on using arrays in bash. (Спасибо lhunath)

+0

Что печатает первые 10 символов, не так ли? – Frank

+0

Нет, он печатает первые 10 элементов массива. Массив содержит имена файлов как элементы. –

+0

Ваша ссылка на АБС плохая. Они не используют кавычки (типичный АБС), тем самым вызывая ошибки слов в расширенном имени файла. ABS полна таких скрытых ошибок, из-за которых каждый, кто учится у него (за исключением вас, по умолчанию, вы делаете это правильно), наследует эти ошибки! Вместо этого я буду ссылаться на http://mywiki.wooledge.org/BashGuide/TheBasics/Arrays. – lhunath

0
FILES=$(ls) 
echo $FILES | fmt -1 | head -10 
+2

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

+0

Я знаю об этом, но думал, что дехман хотел использовать этот конкретный метод, поэтому я считал, что пробелы не будут проблемой. BTW, вы имели в виду FILES = (*) эхо "$ {FILES [@]: 0:10}" ? Это работает лучше здесь. – sunny256

+1

Действительно, я исправляю это. Благодаря! –

2
echo $FILES | awk '{for (i = 1; i <= 10; i++) {print $i}}' 

Edit: ааа, пропустил свой комментарий, вам необходимо их на одной линии ...

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

Это один делает это.

1

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

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

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

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

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

bash foo.sh 10 $FILES

5
FILE="$(ls | head -1)" 

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

+0

Это может дать вам несколько каталогов. Возможно, вы имеете в виду '$ (ls -1 | head -1)'? – nh2

4

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

ls -1 | head -50 
+0

OP хотел напечатать на одной строке. См. Комментарии. – kubanczyk

2

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

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

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

+0

Хороший ответ. Возможно, вы также должны добавить '-1', например' ls -1 | head -10 | tr "\ n" "" ". В любом случае это то, что я искал;) – silgon

+0

Это лучший ответ, на мой взгляд. Ницца и просто. Перечислите их. Выберите первый 10. Разделите строки новой строки для пробелов. Сделано и сделано. Хороший ответ. – user2233949

Смежные вопросы