Итерация по каждой строке вывода ls -l

Я хочу перебрать каждую строку в выводе ls -l/some/dir/* Прямо сейчас я пытаюсь: for x in $(ls -l $1); do echo $x done, однако это повторяется по каждому элементу в строке отдельно, поэтому я получаю

-r - r -----
1
ivanevf
eng
1074
Апр
22
13:07
File1

-r - r -----
1
ivanevf
eng
1074
Апр
22
13:17
File2

Я хочу перебирать каждую строку в целом.

Как это сделать?

Спасибо.

Ответ 1

Установите IFS для новой строки, например:

IFS='
'
for x in `ls -l $1`; do echo $x; done

Поместите вокруг него оболочку, если вы не хотите постоянно устанавливать IFS:

(IFS='
'
for x in `ls -l $1`; do echo $x; done)

Или использовать while | вместо этого прочитайте:

ls -l $1 | while read x; do echo $x; done

Еще одна опция, которая запускает while/read на том же уровне оболочки:

while read x; do echo $x; done << EOF
$(ls -l $1)
EOF

Ответ 2

#!/bin/bash

for x in "$(ls -l $1)"; do 
   echo "$x"
done

Ответ 3

Это зависит от того, что вы хотите делать с каждой строкой. awk - полезная утилита для этого типа обработки. Пример:

 ls -l | awk '{print $9, $5}'

.. в моей системе печатает имя и размер каждого элемента в каталоге.

Ответ 4

Вы также можете попробовать команду find. Если вам нужны только файлы в текущем каталоге:

find . -d 1 -prune -ls

Выполнить команду для каждого из них?

find . -d 1 -prune -exec echo {} \;

Считать строки, но только в файлах?

find . -d 1 -prune -type f -exec wc -l {} \;

Ответ 5

Как уже упоминалось, awk - правильный инструмент для этого. Если вы не хотите использовать awk, вместо синтаксического анализа вывода "ls -l" по очереди, вы можете перебирать все файлы и делать "ls -l" для каждого отдельного файла, например:

for x in * ; do echo `ls -ld $x` ; done

Ответ 6

Утилита read (1) вместе с перенастройкой вывода команды ls (1) будет делать то, что вы хотите.

Ответ 7

Итак, почему никто не предлагал просто использовать опции, которые устраняют те части, которые он не хочет обрабатывать.

В современном Debian вы просто получите свой файл:

ls --format=single-column 

Кроме того, вам не нужно обращать внимание на каталог, в котором вы его используете, если вы используете полный каталог:

ls --format=single-column /root/dir/starting/point/to/target/dir/

Эта последняя команда я использую выше, и я получаю следующий вывод:

[email protected]:~/downloaded/Daily# ls --format=single-column /home/bot/downloaded/Daily/*.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141119_IENT1.txt.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141120_IENT1.txt.gz
/home/bot/downloaded/Daily/Liq_DailyManifest_V3_US_20141121_IENT1.txt.gz