我试图获取仅包含目录名称的列表,以便将其存储在变量中以供 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 -1
而ls -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}'