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?


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.


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


0

One-liner w Bash bez użycia basename :

$ s=/the/path/foo.txt
$ echo "$(b=${s##*/}; echo ${b%.*})"
foo
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.