эффективное обрезание расширения файлов в массиве

Если вы не получили сообщение о том, что задание было уничтожено SLURM, а sacct показывает завершенный статус, у вас есть все основания полагать, что задание завершено.

0
22.10.2019, 10:14
2 ответа

Расширения ${var#word}и ${var%word}также работают с массивами:

arr=(/dir/dir1/foo.ssh /dir/dir2/bar.ssh )
arr2=("${arr[@]##*/}") 
arr2=("${arr2[@]%.ssh}") 
printf "%s\n" "${arr2[@]}"

печатает fooи bar.

Затем эта командная подстановка ls | xargsне работает с именами файлов, содержащими пробелы (даже безxargs)или кавычек (из-заxargs).

На самом деле вы можете расширить glob из переменной, только не заключайте ее в кавычки. Вот так:

array=( $1 )

(Хотя IFSпо-прежнему имеет значение, поэтому шаблоны с пробелами будут ломаться, если сначала не установить его на пустую строку.)

Хотя, если вы просто ищете файлы с именами, оканчивающимися на .ssh, вы можете просто передать каталог в качестве аргумента и подстановку для *.sshв скрипте:

array=( "$1"/*.ssh )
2
28.01.2020, 02:29

скрипт:(удаляет суффикс.ssh и добавляет -SSH к каждому элементу)

array=(abc.ssh xyz.ssh ssh  "q r.ssh s.ssh" "mmm.ssh^Mnnn.ssh")

for e in "${array[@]}"
do
   echo ${e%.ssh}"-SSH"
done

выход:

abc-SSH
xyz-SSH
ssh-SSH
q r.ssh s-SSH
nnn-SSH

С"${array[*]}":

nnn-SSH xyz.ssh ssh q r.ssh s.ssh mmm.ssh

С${array[*]}:

abc-SSH
xyz-SSH
ssh-SSH
q-SSH
r-SSH
s-SSH
nnn-SSH

Отсутствие "ммм" неудивительно:

$  printf "a^Mb"
b$  echo "a^Mb"
b
$ 
0
28.01.2020, 02:29

Теги

Похожие вопросы