【问题标题】:Write all file names (without extension) into an array in Ubuntu terminal将所有文件名(不带扩展名)写入 Ubuntu 终端中的数组
【发布时间】:2017-01-19 15:23:59
【问题描述】:

我想从当前目录中提取所有具有一个特定扩展名 (.com) 的文件的名称,而不使用它们的扩展名,并将它们存储在一个数组中。

这是我尝试过的:

test=$((*.com) | sed 's/.com//g')

我得到了错误

zsh:权限被拒绝:1butene.com

1butene.com 是我拥有的文件。

感谢您的帮助!

【问题讨论】:

    标签: arrays linux sed terminal filenames


    【解决方案1】:

    您当前正在存储一组名称,然后通过管道传输到sed。当 glob 展开时,这将成为表单上的命令:

    1butene.com xxxx | sed 's/.com//g'
    

    这显然是不允许的,因为1butene.com 本身并不是一个命令。


    你要做的就是

    1) 存储数据,
    2) 进行清洁。

    为此,我们有好消息!你可以执行Shell parameter expansion on arrays

    这样你可以将数据存储在一个数组中:

    names=(*.com)
    

    然后将它们全部替换为extracting its name,不带扩展名:

    printf "%s\n" "${names[@]%.*}"
    

    如果你想change values of bash array elements without loop,只需使用语法

    new_array=("${names[@]%.*}")
    

    示例:

    $ touch a{1..3}.{sql,com}
    $ com_names=(*com)
    $ printf "%s\n" "${com_names[@]}"
    a1.com
    a2.com
    a3.com
    $ printf "%s\n" "${com_names[@]%.*}"
    a1
    a2
    a3
    b=("${com_names[@]%.*}")         # assign to a new array
    $ printf "%s\n" "${b[@]}"
    a1
    a2
    a3
    

    【讨论】:

    • 好的,这似乎有点工作。但是如何将这些名称存储在数组中?如果我做 test=(*.com) 然后 test=${"%\n" "${names[@]%.*}"} $test 是空的
    • @user7408924 请参阅我解释的最后一部分,在 Sample 部分之前:var=("${ ... [@]%.*}")。另外,尽量不要将名称 test 用于变量,因为它本身就是一个命令!
    猜你喜欢
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-02
    • 1970-01-01
    • 2012-08-02
    • 2019-07-07
    相关资源
    最近更新 更多