bash - 一行中 bash 脚本中的文件扩展名列表

标签 bash sed filenames ls tr

我目前有以下代码行:

ls /some/dir/prefix* | sed -e 's/prefix.//' | tr '\n' ' '

这确实实现了我想要它做的事情:

  • 获取以前缀开头的文件列表
  • 从每个字符串中删除路径和前缀
  • 删除换行符并替换为空格以供以后处理。

例如:

/some/dir/prefix.hello
/some/dir/prefix.world

应该变成

hello world

但我觉得有更好的方法可以做到这一点。有没有更好的方法在一行中执行此操作?

最佳答案

这是一个只使用内置函数的两行代码:

fnames=(some/dir/prefix*)
echo "${fnames[@]##*.}"

这是它的工作原理:

  • fnames=(some/dir/prefix*) 创建一个包含所有以 prefix 开头的文件的数组,并避免解析 ls 带来的所有问题
  • echo "${fnames[@]##*.}" 是两个参数扩展的组合:${fnames[@]} 打印所有数组元素, ##*. 部分从每个数组元素中删除以 . 结尾的任何内容的最长匹配,只留下扩展名

如果您执意使用单行代码,只需使用 && 连接这两个命令即可。

关于bash - 一行中 bash 脚本中的文件扩展名列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51024506/

相关文章:

linux - 如何在 Unix 代码中捕获文件名并检查文件名中的日期部分?

primefaces - Primefaces文件下载损坏的非英语文件名

python - 区分文件名和 URL

json - 我如何制作这个 jq 表达式,它适用于 jq >= 1.5,对于 < 1.5 的版本向后兼容/正确

bash - 一个简单的 'if' 语句

linux - 如何在 Iterm 中插入制表符?

linux - 为什么通过 Putty 更改为 "sed"不会反射(reflect)在 Cpanel 中?

linux - 如何在特定条件下更改特定字段的值

c - 为什么在重定向到同一文件时会覆盖部分输出,但在重定向到终端时却不会?

regex - bash 正则表达式 在一行中进行多个匹配