2015-03-21 4 views
1

Это моя ls команда и пост-обработки:Как удалить пробелы из вывода команды ls ПОСЛЕ некоторого символа?

ls -l $pwd | tail -n +2 | cut -c1-10,50-999999 | sed 's/./& /g' | 
    sed 's/\(.\{7\}\)/& /g' | sed 's/\(.\{30\}\)/&/g' 

Это выход:

- r w x r - - r - -  a d d . o l d 

Я хочу, чтобы удалить все пробелы в имени файла, так что я могу в конечном итоге что-то вроде это: (помните, что пробел хранится при разрешении)

- r w x r - - r - -  add.old 
+1

Почему вы пытаетесь это сделать? Обратите внимание, что вам не нужно давать конец диапазона с помощью cut: 'cut -c1-10,50-' лучше –

ответ

3

Вы просто этого не делаете. Там есть целый ряд статей, в которых подробно объясняется, почему вы не должны обрабатывать вывод ls, но используйте комбинации таких инструментов, как globeing вашего файла (наиболее вероятно очень полное), find и stat.

, например:

for name in * ;do echo $(stat -c '%A' "$name"):$name ; done 

EDIT:stat дает вам много форматов, чтобы помочь вам достичь желаемых результатов, и теперь, когда это дает однозначный вывод (еще, это может пойти не так такие как новые строки в именах файлов), вы можете просто использовать sed на выходе stat в изоляции. См. man stat.

+0

Довольно уверен, что вы можете сделать это без цикла. Как насчет 'stat -c '% A:% n' * | awk -F: '{gsub (".", "&", $ 1); печать} ' '? – kojiro

+1

Петля существует так, что каждый 7-й символ заменяется на 2 пробела. Ваше решение прокладывает его правильно, но не отвечает требованиям (разделите пользователя, группу и другие разрешения, используя 3 пробела). So '- r w x r - - r - -' становится ' - r w x (3 пробела) r - - (3 пробела) r - - (3 пробела) ' – Todd

+0

Я ценю ответы! Они определенно помогли пролить свет. – Todd

0

Написание пуленепробиваемого кода для разбора 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 
Смежные вопросы