Написание пуленепробиваемого кода для разбора ls
вывод сложный, если имена файлов не являются достаточно чистыми. С предупреждением о том, что ваши имена файлов не должны содержать символы новой строки и должны избегать других управляющих символов (но более или менее все должно быть в порядке), вы можете просто подвергнуть риску анализ вывода с ls
. Если ваши имена файлов ограничены набором символов портативного файла ([-a-zA-Z0-9_.]
), все должно быть хорошо. Но имейте в виду, что не все будут такими же дисциплинированными, как и ваши имена файлов, поэтому ваши сценарии могут неожиданно возникнуть, если кто-то создаст имя с неожиданными символами. Обратите внимание, что ведущие тире в именах файлов могут привести к хаосу; такое имя, как --version
, заставит среднюю утилиту GNU работать, например, неожиданно.
Вы можете использовать cut -c1-10,50-
, чтобы избежать ввода всех этих 9. Вы можете комбинировать свои команды 3 sed
в одном, используя -e
перед каждым выражением.
С небольшим количеством обманутых sed
вы можете легко справиться с интервалом. На моем Mac, правильный столбец для начала имени файла колонок 54, не 50:
$ ls -l |
> sed -e '1d;12q' | # Only 11 file names listed
> cut -c 1-10,54- |
> sed -e 's/\(.\)\(...\)\(...\)\(...\)/\1\2 \3 \4 @@/' \
> -e h -e 's/@@.*/@@/' -e 's/[^@]/& /g' -e G -e 's/\n//' \
> -e 's/@@[^@]*@@//'
- r w - r - - r - - 2da.c
- r w - r - - r - - 3dalloc1.c
- r w - r - - r - - 3dalloc2.c
- r w - r - - r - - 3dalloc3.c
- r w - r - - r - - 3dalloc4.c
- r w - r - - r - - 4 @@ Testing
- r w - r - - r - - @@ Testing
d r w x r - x r - x Floppy
d r w x r - x r - x IQ
d r w x r - x r - x Primes
d r w x r - x r - x SHA-256
$
Что делает команду sed
делать?
- Заменить поля разрешений с пробелом после каждой группы из 3-х битов разрешений и добавить
@@
в конце разрешений.
- Скопируйте измененную строку в пространство удержания.
- Замените
@@
и все после него всего @@
.
- Поместите пробел после каждого символа
@
.
- Добавить пространство для удержания в пространство шаблона с помощью новой строки.
- Удалить новую строку.
- Отметьте два маркера
@@
и все, что находится между этим не является @
.
Это оставляет @@
маркеры в именах файлов нетронутым - свидетель двух имен с пробелами в них, которые содержат @@
.
Для записи, то 11 строк передается cut
, а затем sed
были:
-rw-r--r-- 1 jleffler staff 2362 Mar 6 19:48 2da.c
-rw-r--r-- 1 jleffler staff 1638 Mar 6 19:48 3dalloc1.c
-rw-r--r-- 1 jleffler staff 2870 Mar 6 19:48 3dalloc2.c
-rw-r--r-- 1 jleffler staff 2968 Mar 6 19:48 3dalloc3.c
-rw-r--r-- 1 jleffler staff 2096 Mar 6 19:48 3dalloc4.c
-rw-r--r-- 1 jleffler staff 0 Mar 21 16:46 4 @@ Testing
-rw-r--r-- 1 jleffler staff 0 Mar 21 16:47 @@ Testing
drwxr-xr-x 4 jleffler staff 136 Mar 9 23:03 Floppy
drwxr-xr-x 8 jleffler staff 272 Mar 6 19:48 IQ
drwxr-xr-x 33 jleffler staff 1122 Mar 6 19:48 Primes
drwxr-xr-x 13 jleffler staff 442 Mar 6 19:48 SHA-256
Почему вы пытаетесь это сделать? Обратите внимание, что вам не нужно давать конец диапазона с помощью cut: 'cut -c1-10,50-' лучше –