Распечатка имен только каталогов, а не файлов (BASH) - PullRequest
0 голосов
/ 08 октября 2009

У меня есть большинство того, что мне нужно до сих пор, я просто не уверен в команде grep, чтобы получить только каталоги или, если их нет. Для контекста это оригинальный запрос:

Этот скрипт должен принимать один аргумент командной строки, который будет путем к каталогу. (готово) Сценарий должен убедиться, что путь, по сути, является каталогом и что у пользователя есть разрешение на чтение. (готово) Ваша программа должна затем захватить вывод команды ls в каталоге. (сделано) Затем следует распечатать имена только найденных подкаталогов. Файлы должны быть проигнорированы. (???)

Пока у меня есть:

#!/bin/bash

if [ -d $1 ] && [ -r $1 ] ; then 
  ls -l $1 | tee output | grep  ______
fi

Ответы [ 7 ]

7 голосов
/ 08 октября 2009

сделать grep

ls -l | grep '^d'

или просто используйте find

find $1 -type d
2 голосов
/ 08 октября 2009

Подсказка & mdash; от man ls:

-F ... Отображать косую черту (/) сразу после каждого имени пути, являющегося каталогом, звездочку (*) после каждого исполняемого файла, знак «в» (@) после каждого символического ссылка, знак равенства (=) после каждого сокета, знак процента (%) после каждого отключения и вертикальная черта (|) после каждого, который является FIFO.

-p ... Записывать косую черту (/) после каждого имени файла, если этот файл является каталогом.

1 голос
/ 08 октября 2009

ls "только для глаз"

См .: Разбор ls

find - правильная команда для использования. См. ответ Энди Росса .

1 голос
/ 08 октября 2009
find $1 -maxdepth 1 -type d

тоже хорошо работает. Если приведенный выше пример awk имеет значение, вы можете также включить perl:

grep -d, glob("$path/*")

... получит список каталогов при вызове в контексте массива.

1 голос
/ 08 октября 2009

Опция -p для ls, вероятно, будет полезна. Смотри man ls.

0 голосов
/ 08 октября 2009

Вам, вероятно, не нужны проверки -d или -r:

shopt -s failglob
echo "$1"/*/.

Замените эхо тем, что вы действительно хотите сделать (ваш первоначальный вопрос не говорит).

0 голосов
/ 08 октября 2009

ls -l . | awk '/^d/{printf "%s ",$8}'

Хотя аргумент $8 зависит от вывода ls -l на вашем компьютере

...