Почему 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}'