как извлечь только определенную часть имени файла в bash

Вы можете предварительно -заполнить стек каталогов в файле ~/.bashrc, если хотите:

for dir in "$HOME/dir" /usr/src /usr/local/lib; do
    pushd -n "$dir" >/dev/null
end

или, если вы хотите поместить каталоги в массив и использовать их оттуда:

dirstack=( "$HOME/dir"
           /usr/src
           /usr/local/lib )

for dir in "${dirstack[@]}"; do
    pushd -n "$dir" >/dev/null
end

unset dirstack

С -npushdфактически не изменит рабочий каталог, а просто добавит указанный каталог в стек.

При желании вы можете сохранить значение DIRSTACKмассива (имени переменной верхнего -регистра здесь ), который является текущим стеком каталогов, в файл из ~/.bash_logout, а затем прочитать этот файл в ~/.bashrcвместо использования предопределенного массива.

В~/.bash_logout:

declare -p DIRSTACK >"$HOME/.dirstack"

В~/.bashrc:

if [ -f "$HOME/.dirstack" ]; then
    source "$HOME/.dirstack"
fi

Я не знаю, насколько хорошо это будет работать в ситуации, когда вы используете несколько терминалов. Файл .dirstackперезаписывался бы каждый раз при выходе из терминала, если бы он запускал bashв качестве оболочки входа в систему.

2
02.03.2018, 20:41
1 ответ

Con un formato de nombre de archivo como ese, puede eliminar la extensión y luego simplemente eliminar todo hasta el último punto.

Con ampliación de parámetros:

for f in./webserver.123.*; do
    d=${f%.csv}          # remove trailing.csv
    d=${d##*.}           # remove all up to (now) last.
    echo "filename: $f date: $d"
done

o con sed:

for f in./webserver.123.*; do
    d=$(echo "$f" | sed -e 's/\.csv$//' -e 's/.*\.//');
    echo "filename: $f date: $d";
done
6
27.01.2020, 21:50

Теги

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