【发布时间】:2014-05-12 05:28:03
【问题描述】:
我希望列出当前目录中所有文件扩展名为“.addr_book”的文件,但扩展名不可见。
我使用了ls | sed -e 's/\..*$//',但这会显示当前目录中的所有文件。有没有办法让它只显示 .addr_book 文件。
谢谢。
【问题讨论】:
我希望列出当前目录中所有文件扩展名为“.addr_book”的文件,但扩展名不可见。
我使用了ls | sed -e 's/\..*$//',但这会显示当前目录中的所有文件。有没有办法让它只显示 .addr_book 文件。
谢谢。
【问题讨论】:
我会推荐这种我经常使用的非常简单的方法:
(选项 -C1 仅将 ls 输出格式化为一列,这是文件名)
ls -C1 *.addr_book | awk -F。 '{ 打印 $1 }'
希望这会有所帮助!
丹尼尔。
【讨论】:
你可以这样做:
ls | awk -F"\.addr_book" 'NF>1 {print $1}'
这将使用.addr_book作为分隔符来划分所有文件名。
如果数字字段大于1,则打印第一部分。
【讨论】:
. 前面应该有一个反斜杠,并且(理论上,可能不是在实践中)像 a.addr_book.2nd.title.addr_book 这样的文件可能存在问题,例如……问候。 ..
试试:
for f in *.addr_book; do
[ -e "$f" ] && printf "%s\n" "${f%.*}"
done
[ -e "$f" ] 用于不存在 *.addr_book 文件的情况下,否则会出现错误结果..
【讨论】:
shopt -s nullglob。
for file in *.addr_book; do
echo "${file%.addr_book}" # removes the trailing '.addr_book' from $file
done
【讨论】:
GNU parallel的解决方案:parallel echo {.} ::: *.addr_book
你可以使用basename:
for i in *.addr_book; do
basename "$i" .addr_book
done
来自man basename:
basename NAME [SUFFIX]
...
Print NAME with any leading directory components removed. If speci‐
fied, also remove a trailing SUFFIX.
【讨论】: