Ітерація над кожним рядком ls -l виводу


120

Я хочу повторити кожен рядок у висновку: 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

Але я хочу переглядати кожен рядок у цілому. Як це зробити?


1
Завжди цитуйте змінні (і вихід команди), якщо у вас немає конкретної причини цього не робити.
Гленн Джекман

Відповіді:


247

Встановіть 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 x; do echo $x; done << EOF
$(ls -l $1)
EOF


1
Що тут роблять $ 1? Мені потрібно використовувати це у написаному сценарієм, який приймає аргументи. $ 1 скидає речі. Що я можу поставити туди замість 1 долара, щоб отримати такий же ефект? Я хотів би використати друге рішення.
noob-in-need

@ noob-in-need Замініть його будь-яким каталогом, який ви хочете перелічити
vpzomtrrfrt

1
Можливо, ви захочете зробити це, read -rінакше баш зніме незбільшені косої риски з даних.
Брайан Гордон

6

Це залежить від того, що ви хочете робити з кожним рядком. awk - корисна утиліта для цього виду обробки. Приклад:

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

.. на моїй системі друкує ім'я та розмір кожного елемента в каталозі.


3

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

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

3

Ви також можете спробувати findкоманду. Якщо ви хочете лише файли в поточному каталозі:

find . -d 1 -prune -ls

Виконати команду на кожному з них?

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

Порахувати рядки, але лише у файлах?

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


знахідка зламана. Ioften отримує кілька химерних повідомлень про помилки. він хоче надати мені допомогу, коли командний рядок справді дійсний, і здається, що як тільки він почне це робити, він не зупиниться до наступного перезавантаження МАЙБЕ. іноді здається випадковим за своєю суттю щодо помилок. не впевнений, як я можу повідомити про помилку.
Джим Майклс

1

Утиліта read (1) разом із перенаправленням виводу команди ls (1) виконає все, що вам потрібно.


-1

Отже, чому ніхто не запропонував використовувати варіанти, які усувають частини, які він не хоче обробляти.

У сучасному 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
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.