2017-01-19 3 views
1

Я хотел бы извлечь имена всех файлов с одним конкретным расширением (.com) без их расширений из текущего каталога и сохранить их в массиве.Запишите все имена файлов (без расширения) в массив в терминале Ubuntu

Это то, что я пробовал:

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

Я получаю ошибку

ЗШ: разрешение отказано: 1butene.com

1butene.com файл у меня есть.

Благодарим за помощь!

ответ

0

В настоящее время вы храните набор имен, а затем трубопроводы до sed. Когда Глоб расширяется это становится команда на форме:

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 
+0

Хорошо, что, кажется, работает как-то. Но как сохранить эти имена в массиве? Если я выполняю test = (\ *. Com), а затем test = $ {"% \ n" "$ {names [@]%. \ *}"} $ Test пусто – user7408924

+0

@ user7408924 см. Последнюю часть моего объяснения , перед разделом _Sample_: 'var = (" $ {... [@]%. *} ")'. Кроме того, постарайтесь не использовать имя 'test' для переменных, так как это сама команда! – fedorqui

+0

Не смотрите на свое последнее редактирование. Работает! Спасибо! – user7408924

Смежные вопросы