2016-01-28 3 views
1

Я пытаюсь загрузить имена файлов в массив в bash. В настоящее время я использую:Загрузить имена файлов в массив без имени или расширения каталога

testarr=(csv/*.csv) 

Который дает мне такие элементы, как

csv/filename.csv 

Как я могу добавить только «имя файла» в массив?

Спасибо!

+0

@ lurker, ваше предложение ошибочно, так как исправлено с именами файлов с пробелами или, в частности, подстановочными символами с пробелами. 'foo = ($ (...))' является антипатерном вообще только по той причине: содержимое расширения разделяется по строкам и glob-расширенным, входящим в массив, что означает, что они могут не соответствовать их первоначальной форме. (Кроме того, поток имен файлов, разделенных символами новой строки, по своей сути ненадежен, поскольку имена файлов могут сами содержать литералы новой строки). –

ответ

5

Проще всего сначала добавить полное имя, а затем раздеться части, которые вы не хотите, используя parameter expansion:

testarr=(csv/*.csv)   # load literal filenames 
testarr=("${testarr[@]##*/}") # strip off directory names 
testarr=("${testarr[@]%.csv}") # strip off extensions 
0

Это можно сделать также с помощью BASENAME -a:

testarr=($(basename -a csv/*.csv)) 
+1

Это багги: посмотрите, что он делает, если в любом из имен файлов есть пробелы (или, в частности, подстановочные символы с пробелами). –

+0

'touch 'csv/hello * world.csv'', чтобы подражать последнему случаю для тестирования. 'touch $ 'csv/hello \ nworld.csv' является еще одним поворотным аргументом. –

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