Як вибрати поле / стовпець з виводу `ls -l`?


22

Моя мета оманливо проста (принаймні, для мене). Я хочу взяти результат ls -lабо ls -lhвибрати лише одне поле.

Я шукаю, щоб це було якомога куленебезпечнішим, під чим я маю на увазі, припускаю, що назви файлів можуть мати змінну кількість пробілів, не все в полі має однакову довжину тощо.

Бонусні бали за те, що у вас є сценарій, який буде приймати назву поля (або навіть просто номер поля), а потім повертати вміст поля.

Я хочу повернути

введіть тут опис зображення

в:

введіть тут опис зображення

Відповіді:


41

Спробуйте ls -l | awk '{print $7}'.

awk вибирає стовпці, щоб він ідеально підходив до цього завдання.


3
Як пояснив @ormaaj: Не покладайтеся на інформацію, яка доступна в конкретних місцях ls. findКоманда є надзвичайно корисною.
Падді Ландау

@PaddyLandau Як використовувати команду find для друку розміру файлу в мегабайти, як я можу ls -l --block-size=M?
SurpriseDog

@Benjamin - lsКоманда не є стандартом POSIX, тому сценарій, від якого залежить, lsможе вийти з ладу на різних системах або навіть з часом. Детальну інформацію див. У відповіді від @ormaaj на цій сторінці. Один із способів зробити те, що ви просите, - це петля Баша. Ось приклад. for FILENAME in *; do FILESIZE=$(( $( stat --format=%s "${FILENAME}" ) / 1024 )); echo "${FILENAME}" ${FILESIZE}; done. Звичайно, замість цього echoви б використовували обробку.
Падді Ландау

@PaddyLandau Я щойно закінчив перезаписувати висновок команди find, ... | xargs -d '\n' du -mяка працює так само добре.
SurpriseDog

@Benjamin Ви можете поглянути на -execваріант find.
Падді Ландау

17

Ніколи не розбирайте лс . Використовуйте GNU find. Або , якщо портативність байдуже, stat(1).

find . -maxdepth 1 -printf '%Td\n'

Щоб прочитати дані, окрім списків імен файлів, за рядком та розділити їх на поля, див .: BashFAQ / 001

Не існує методів надійного зчитування списку імен файлів, визначених новим рядком, які мають сенс за більшості обставин.


1

Ви можете отримати конкретний стовпець у оболонці, наприклад:

ls -al | while read perm bsize user group size month day time file; do echo $day; done

або awkяк показано у відповіді @Corey , cut -c44-45він також працюватиме після налаштування (оскільки lsмає виправлені стовпці) чи будь-що інше, однак головна проблема полягає в тому, що він не буде надійним і куленепроникним (наприклад, на Unix це може бути $6, ні $7, і це змінюється залежно від аргументів), роблячи це не зручним для машин, тому не рекомендується взагалі аналізувати lsкоманду .

Найкраще використовувати різні доступні команди, такі як findабо stat, які можуть надати відповідні параметри для форматування вихідного сигналу у міру необхідності. Наприклад:

$ stat -c "%x %n" *
2016-04-10 04:53:07.000000000 +0100 001.txt
2016-04-10 05:08:42.000000000 +0100 7c1c.txt

Щоб повернути стовпчик лише днів змін, спробуйте цей приклад:

stat -c "%x" * | while read ymd; do date --date="$ymd" "+%d"; done

Варто зазначити, що GNU statможе мати різні варіанти BSD stat, тому він все одно не буде бронезахищеним для різних операційних систем.


1
+1 для згадки, що ls не слід аналізувати так само, як і для використання stat. dateоднак налаштування невірно. Слід додати --date=$ymd, оскільки dateсам надрукує поточний день, але мета тут - перетворити формат файлу дати
Сергій Колодяжний

ls -la | cut -c32-33Команда в повній чесності просто абсолютно ненадійна, а не тільки з - за можливі помилки , з іменами файлів, але просто тому , що це залежить від довжини і від файлів імен користувачів і розміру. stat -c "%x" *.*Команда виглядає нормально, але за допомогою *.*ви restricing це тільки імена файлів , що містять точку. Я здогадуюсь, намір полягав у тому, щоб схопити також приховані файли; в цьому випадку ви повинні включити підстановку для заздалегідь і складають приховані використовувати *замість *.*: shopt -s dotglob; stat -c "%x" * | [...].
кос

Ну, і що Серг сказав також, вам слід додати --date="$ymd"до dateкоманди, інакше вона буде надрукована поточним днем ​​місяця.
кос

Дякуємо за коментарі. Я вирішив проблеми та наводив кращий початковий приклад.
kenorb
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.