为什么 ls -1 不显示所有结果?

为什么 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

问题是,我需要这个是可移植的,所以我宁愿不要 awk 部分,因为它可能不总是第九列。为什么 不起作用ls -1ls -l /var/lib/mysql | grep -e '^d' | awk '{print $9}'起作用?

答案1

如果您尝试可移植地找到所有目录,您可以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了解有关该道路危险的更多信息

答案2

首先,grep 匹配文本模式,其中 ^d 明确匹配以 d 字符开头的所有行。执行 ls -l 时,如果行是目录,则以 drwx 开头;如果是文件,则以 -rwx 开头;如果是链接,则以 lrwx 开头,等等(可能具有读/写/执行权限)。执行 ls -1 时,它仅列出文件或目录名称,没有其他信息,因此 grep ^d 只会显示以 d 开头的文件和目录。

有两种方法可以完成您要寻找的操作:

要使用 ls 命令仅列出目录,您需要“ls -d */”。要获得所需的结果,请在一行中列出所有目录,然后根据需要删除尾随的 / 字符:

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

或者,您可以使用 ls -l 命令,像您所做的那样对目录进行 grep,然后对最后一列而不是第 9 列进行 awk:

ls -l | grep ^d | awk '{print $NF}'

相关内容