Я хочу выполнить итерации по каждой строке в выводе: ls -l /some/dir/*
Прямо сейчас я пробую: for x in $(ls -l $1); do echo $x; done
Однако это выполняет итерации по каждому элементу в строке отдельно, таким образом, я добираюсь:
-r--r-----
1
ivanevf
eng
1074
Apr
22
13:07
File1
-r--r-----
1
ivanevf
eng
1074
Apr
22
13:17
File2
Но я хочу выполнить итерации по каждой строке в целом, все же. Как я делаю это?
Установите 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
Как уже упоминалось, для этого подходит awk. Если вы не хотите использовать awk, вместо анализа вывода «ls -l» построчно, вы можете перебрать все файлы и выполнить «ls -l» для каждого отдельного файла следующим образом:
for x in * ; do echo `ls -ld $x` ; done
Это зависит от того, что вы хотите делать с каждой строкой. awk - полезная утилита для этого типа обработки. Пример:
ls -l | awk '{print $9, $5}'
.. в моей системе печатается имя и размер каждого элемента в каталоге.
Утилита read (1) вместе с перенаправлением вывода команды ls (1) будет делать то, что вы хотите.
Вы также можете попробовать команду find
. Если вам нужны файлы только в текущем каталоге:
find. -d 1 -prune -ls
Выполнить команду для каждого из них?
find. -d 1 -prune -exec echo {} \;
Считать строки, но только в файлах?
найти. -d 1 -prune -type f -exec wc -l {} \;