Почему ls -1 не показывает все результаты?

Я пытаюсь получить список только имен каталогов, чтобы сохранить его в переменной для foreach для последующей обработки.

Тем не менее, просто тестирование ls Сначала я получаю странные результаты.

Например:

ls -1 /var/lib/mysql/ | grep -e '^d'
db_nagiosql
db_nagiosql_v32
discount-o-matic
drupal
drupal5

Тем не менее, это делает то, что должно делать:

ls -l /var/lib/mysql | grep -e '^d' | awk '{print $9}'
alex
bugs
bugtracker
bugzilla
cacti
cerb5
db_nagiosql
db_nagiosql_v32
discount-o-matic
drupal
drupal5
earth
fft
final_function_test
firm_ware
flyspray
gallery2
graphics
jon
joomla
mysql
nconf
old_fft
opendocman
oreon
part-number
phpbb
phpbugtracker
phplist
postnuke
teldir
test
testing
vanilla
vision
wikidb
wordpress
zen

Проблема в том, что мне нужно, чтобы это было переносимо (ish), поэтому часть awk у меня, скорее всего, нет, поскольку она не всегда может быть девятой колонкой. Почему ls -1 не работает в то время как ls -l /var/lib/mysql | grep -e '^d' | awk '{print $9}' работает?

2 ответа

Решение

Если вы пытаетесь найти все каталоги, которые можете использовать find вот так:

 find /var/lib/mysql/ -maxdepth 1 -mindepth 1 -type d -exec basename {} \;

или если у вас есть GNU (не переносимый)

 find /var/lib/mysql/ -maxdepth 1 -mindepth 1 -type d -printf "%f\n"

Предполагая, что вы хотите продолжить их обработку, вы можете адаптировать то, что вы делаете, чтобы иметь возможность пройти полный путь и позволить find помощь с -print0 а также xargs -0 так что вы не получите путаницы со специальными символами в именах путей. Узнайте, почему вы не должны анализировать выводls для получения дополнительной информации об опасностях этой дороги

Во-первых, grep соответствует текстовому шаблону, где ^ d специально соответствует всем строкам, начинающимся с символа d. Когда вы выполняете команду ls -l, строки начинаются с drwx, если они являются каталогом, -rwx, если они являются файлом, lrwx, если они являются ссылкой, и т. Д. (Предоставьте или получите права на чтение / запись / выполнение). Когда вы нажимаете ls -1, он выводит только имя файла или каталога без какой-либо другой информации, поэтому grep'ing ^d получит только те файлы и каталоги, которые начинаются с d.

Есть два способа сделать то, что вы ищете:

Чтобы получить список только каталогов с помощью команды ls, вам нужен "ls -d */". Чтобы получить желаемый результат, вы перечисляете все каталоги в одной строке, а затем удаляете завершающий символ / символ, если хотите:

ls -1d */ | sed 's|/$||'

Или же вы можете использовать команду ls -l, grep для каталогов, как вы, и затем awk в последнем столбце, а не в 9-м столбце:

ls -l | grep ^d | awk '{print $NF}'
Другие вопросы по тегам