Как отобразить только 1 столбец вывода команды ls?


55

Скажем, когда я выполняю команду ls, результат будет:

file1 file2 file3 file4

Можно ли отобразить только определенный столбец вывода, в данном случае file2? Я пробовал следующее безуспешно:

echo ls | $2

По сути, все, что я хочу сделать, это отобразить только второй столбец, в этом случае я хочу повторить:

file2

2
Какова ситуация , в которой вы действительно хотите столбец в lsвыходной?
Михас

11
Как правило, вы никогда не должны анализировать ls . Почти всегда есть лучшие способы получения необходимой информации.
Terdon

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

Ответы:


83

Следующая команда отформатирует вывод ls в один столбец

ls -1 /directory

2
Но это не дает вам только одну колонку, в которой заинтересован OP.
Anthon

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. Для решения, переносимого на все оболочки типа Bourne, вы можете использовать: set -- *; printf '%s\n' "$2"вместо этого.
Стефан Шазелас

@ StéphaneChazelas По крайней мере, для этого вопроса теги включают «bash», поэтому этот ответ специфичен для этой оболочки.
Крис Даун

ls -C | awk '{print $ 1} выглядит одинаково ... почему $ 2?
Boctulus

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; это не останавливается на "признанной человеком" колонке
Джефф Шаллер

Это не плохая идея .. просто нужно доработать.
Пруссван
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.