Jak wyodrębnić nazwę pliku bez rozszerzenia z pełnej ścieżki?

10

Próbuję poprawić mój pierwszy skrypt bash, aw pewnym momencie nazwa pliku jest przekazywana do skryptu jako $1. Muszę wyodrębnić nazwę pliku bez rozszerzenia.
Obecnie zakładam, że wszystkie rozszerzenia są trzyliterowe, więc usuwam ostatnie 4 znaki, aby uzyskać nazwę pliku:

a="${1:0:-4}"

Ale muszę być w stanie pracować z rozszerzeniami, które mają więcej niż trzy znaki, jak %~n1w systemie Windows.
Czy jest jakiś sposób na wyodrębnienie nazwy pliku bez rozszerzenia z argumentów?

użytkownik304822
źródło
stackoverflow.com/questions/2664740/…
sancho.s ReinstateMonicaCellio

Odpowiedzi:

27

Zwykłym sposobem na zrobienie tego w bash jest użycie rozszerzenia parametrów. (Zobacz stronę man bash i wyszukaj „Parameter Expansion”.)

a=${1%.*}

%Wskazuje, że wszystko pasujący wzorzec następujący ( .*) z prawej strony, wykorzystując najkrótszą mecz to możliwe, powinien być usunięty z parametrem $1. W takim przypadku nie potrzebujesz podwójnych cudzysłowów („) wokół wyrażenia.

garyjohn
źródło
1
Wzorce plików są na ogół takie: „Coś.eng.ext”. Oczywiście w tym przypadku rozszerzenie jest rozszerzeniem, ale użycie $ {1%. *} Zwróci tylko część „Coś”, prawda?
user304822,
2
Nie . ${1%.*}Wróci Something.eng. Jeśli chcesz usunąć wszystko po prawej stronie pierwszego, w .tym .użyj ${1%%.*}, który zwróci Something.
garyjohn
13

Jeśli znasz rozszerzenie, możesz użyć basename

$ basename /home/jsmith/base.wiki .wiki
base
Steven Penny
źródło
0

One-liner w Bash bez użycia basename :

$ s=/the/path/foo.txt
$ echo "$(b=${s##*/}; echo ${b%.*})"
foo
LuckyDams
źródło