Итерация по каждой строке вывода 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