Як я повторюю лише 1 стовпець виводу з команди ls?


54

Скажемо, коли я виконую команду ls, вихід:

file1 file2 file3 file4

Чи можливо відобразити лише певний стовпець виводу, у цьому випадку файл2? Я пробував наступне без успіху:

echo ls | $2

В основному все, що я хочу зробити, - це відлуння лише другого стовпця, в цьому випадку я хочу відлунювати:

file2

2
Яка ситуація , в якій ви дійсно хочете стовпець в lsвихідний?
michas

11
Як правило, ви ніколи не повинні розбирати ls . Майже завжди є кращі способи отримання потрібної інформації.
terdon

Я б не робив цього незнайомця: P (вибачте, що мені завжди сподобалася ця фраза) кількість стовпців залежить від файлів імен і папок, тому другий стовпець може бути потрібним, а може, ні, а може бути в одному lsі після створення деяких файлів / папок це може бути вже не те, що ви хочете. Як зазначив Тердон, там впевнені, що є кращі способи отримати те, що ви хочете
YoMismo

Відповіді:


81

Наступна команда відформатує вихід ls в один стовпчик

ls -1 /directory

2
Але це не дає вам лише одну колонку, яка зацікавлена ​​в ОП.
Антон

1
Щоб правильно це зробити: ls -1 /directory | head -2 | tail -1абоls -1 /directory | perl -ne 'print if $. == 2'
KWubbufetowicz

@KWubbufetowicz ls | sed -n '1p;q'здається простішим
Fiximan

3
Відповідь я шукав, але не на питання про ОП.
Майкл Ланг

36

Ви шукаєте це:

ls -C | awk '{ print $2 }'

Однак, припускаючи, що ви будете намагатися використовувати це ім'я файлу пізніше, не робіть цього, оскільки воно порушиться на назви файлів, що містять пробіли. Замість цього помістіть файли в масив і отримайте другий, що дозволяє уникнути взагалі будь-якого аналізу:

files=(*)
printf '%s\n' "${files[1]}"

Порядок повернення файлів залежить від значення LC_COLLATE. Таким чином, ви можете встановити LC_COLLATE=Cспочатку, якщо ви хочете "стандартне" сортування у всіх кутових випадках.


Зауважте, що індекси масиву починаються 1з чутливих оболонок (zsh, yash, fish, csh, tcsh, rc, es ...) і з 0в ksh та bash. Для рішення, портативного для всіх оболонок Борна, ви можете використовувати: set -- *; printf '%s\n' "$2"натомість.
Стефан Шазелас

@ StéphaneChazelas Принаймні для цього питання теги містять "bash", тому ця відповідь специфічна для цієї оболонки.
Кріс Даун

ls -C | awk '{print $ 1} виглядає дають такий же вихід ... чому $ 2?
боктул

7

Вам потрібно буде додати -Cяк lsвикористовує режим одного стовпчика, коли вихід не є терміналом. awkпотім друкує другий стовпчик:

ls -C | awk '{print $2}'

2

Я думаю, ти шукаєш

ls -1

Він не показуватиме дозвіл, власника, групу, дату, розмір ..., а просте ім’я файлу в одному стовпчику.


1
Ця відповідь не тільки невірна, але й дана раніше.
Скотт

Хоча я усвідомлюю, що це неправильно для початкового питання, саме це я шукав. Отже, дякую.
AntumDeluge

0

Єдиний спосіб працює для мене - додавання "-всі". Це:

ls -C -all | awk '{ print $1 }'

Тому що -allдодайте більше стовпців, таких як користувач, дозволи та ін.


0

Як уже згадувалося - використання стовпців для розбору lsрезультатів не дуже надійне, оскільки lsрозбиває рядки відповідно до довжини імені вашого файлу та ширини терміналу. Хоча часто цікаво відобразити єдиний стовпець списку елементів. Це можна зробити за допомогою команди cut:

echo file1 file2 file3 file4 | cut -d" "  -f2

відобразиться

file2

Зверніть увагу, що -dдозволяє вибрати роздільник стовпця, наприклад, з

cur -d, -f2

ви можете відобразити другий стовпець списку, розділеного комами.


0

Припустимо, якщо ви хочете відобразити лише конкретне ім'я файлу під поточним шляхом використання команди нижче

команда:

find path -maxdepth 1 -iname "filename"|sed "s/\.\///g"

0

Це складно, оскільки аналіз ls -Cзалежить від:

  1. довжина імені файлу (що залежить від вказаного списку файлів, переданого до ls -C)
  2. ширина клем.
  3. факт, що ls -Cвихід є стовпчастим, але може бути налаштований на різну кількість пробілів як роздільники полів.
  4. можливість пробілів у назви файлів (відображення яких залежить від lsобраних параметрів відображення).

Поки почнемо з простішої проблеми ( тобто не №4 вище), припустимо, що у файлах файлів немає пробілу . Щоб надрукувати колонку №2, це працює:

COLUMNS=$COLUMNS ls -C | tr -s ' ' '\t' | cut -f2

Розкручуючи це:

  • COLUMNS=$COLUMNSгарантує, що довжина стовпця, що подається, | залишається узгодженою з поточним відображенням терміналу. Зміна цього в довільне значення теж працює, так COLUMNS=50чи COLUMNS=70 викликало б ls -Cпереставляти речі в Відповідно до цих ширин.

    Іншим методом було б використання -wперемикача, наприклад :

    ls -w${COLUMNS} -C | tr -s ' ' '\t' | cut -f2
  • trробить роздільники полів послідовними: одна вкладка між кожним стовпцем.

  • cut виводить потрібний стовпчик.


Метод білого простору в очікуванні ...
agc

-1
num_chars=54 # offset
ls -ltr | cut -c$num_chars-

змінити кількість символів (54) за необхідності, щоб ви отримали лише потрібні дані.


2
уточнити, використовуючи 54-розрізаний підказки кожному символу, починаючи з позиції 54; він не зупиняється на стовпчику «визнаний людиною»
Джефф Шаллер

Це не погана ідея. Просто потрібно вдосконалити.
prusswan
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.