【问题标题】:List files of directory into array without file extension将目录的文件列出到没有文件扩展名的数组中
【发布时间】:2017-06-27 00:28:02
【问题描述】:

我有类似的文件:

abc.json
xyz.json
pdf.json

我想在没有“json”扩展的情况下得到这样的结果:

somearray=(abc, xyz, pdf)

【问题讨论】:

  • 数组中的逗号实际上没有意义。你拥有它的想法是什么?你有没有尝试解决这个问题?

标签: linux bash shell


【解决方案1】:

你可以这样做:

some_array=( $(ls | sed 's/.json$//') )

或者,如果您只是在寻找 .json 文件,那么:

some_array=( $(ls | grep '.json$' | sed 's/.json$//') )

如果您的文件中包含空格或通配符 (*),则上述方法不安全。

如果您使用的是 Bash,那么您可以使用参数扩展来取出扩展。而且这种方法比以前的方法更健壮——它可以优雅地处理带有空格或通配符的文件:

declare -a some_array
for file in *.json; do
  some_array+=( "${file%.json}" )
done

查看这些帖子:

【讨论】:

  • 在参数展开的两边加引号没什么问题,其实效率最高。
  • 其实处理带空格的文件是需要的。已更正,感谢您注意到它,@Inian。
  • 您可以做得比解析ls 的输出要好得多,而背靠背使用grep/sed 会使情况变得更糟。在前两种情况下,词分裂的可能性很大。最好不要推荐前两种方法。
  • @Inian:那么请发布一个改进的版本,以便其他人学习。只是抱怨不是高质量的评论。
  • 我根据@Inian 的评论更新了答案。也很高兴看到他的回答。
【解决方案2】:

您可以通过 globbing 将文件放入数组中,然后通过参数扩展删除扩展名:

$ arr=(*.json)
$ declare -p arr
declare -a arr='([0]="abc.json" [1]="pdf.json" [2]="xyz.json")'
$ arr=("${arr[@]%.json}")
$ declare -p arr
declare -a arr='([0]="abc" [1]="pdf" [2]="xyz")'

【讨论】:

    猜你喜欢
    • 2020-12-15
    • 1970-01-01
    • 2019-07-07
    • 2013-09-20
    • 2012-02-24
    • 1970-01-01
    • 1970-01-01
    • 2019-12-26
    • 1970-01-01
    相关资源
    最近更新 更多