Итерация по каждой строке вывода ls -l - PullRequest
107 голосов
/ 18 мая 2010

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

-r - r -----
1
ivanevf
eng
1074
Апр
22
13:07
Файл1

-r - r -----
1
ivanevf
eng
1074
Апр
22
13:17
Файл2

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

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

Спасибо.

Ответы [ 6 ]

226 голосов
/ 18 мая 2010

Установите IFS на новую строку, например:

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

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

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

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

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

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

while read x; do echo $x; done << EOF
$(ls -l $1)
EOF
7 голосов
/ 18 мая 2010

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

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

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

4 голосов
/ 22 мая 2010

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

find . -d 1 -prune -ls

Запустить команду на каждом из них?

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

Подсчет строк, но только в файлах?

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

4 голосов
/ 18 мая 2010

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

for x in * ; do echo `ls -ld $x` ; done
2 голосов
/ 18 мая 2010

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

0 голосов
/ 21 декабря 2014

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

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

ls --format=single-column 

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

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

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

bot@dev:~/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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...