Jak oddzielić nazwę pliku i rozszerzenie w Bash

Jak oddzielić nazwę pliku i rozszerzenie w Bash
Jak oddzielić nazwę pliku i rozszerzenie w Bash

Wstęp:

Podczas pracy z plikami w Bash często może być konieczne oddzielenie nazwy pliku od jego rozszerzenia. Typowe podejście wykorzystuje polecenie `cut`, ale ta metoda może się nie powieść w przypadku nazw plików zawierających wiele kropek.

Na przykład nazwa pliku taka jak „a.b.js” zostanie niepoprawnie podzielona na „a” i „b.js” zamiast „a.b” i „js”. Chociaż Python zapewnia łatwe rozwiązanie za pomocą `os.path.splitext()`, użycie Pythona może nie zawsze być najbardziej efektywną opcją. W tym artykule omówiono lepsze metody realizacji tego zadania w języku Bash.

Komenda Opis
${variable%.*} Rozwijanie parametrów w celu usunięcia rozszerzenia z nazwy pliku.
${variable##*.} Ekspansja parametrów w celu wyodrębnienia rozszerzenia z nazwy pliku.
awk -F. Ustawia separator pól na kropkę używaną do podziału nazwy pliku.
OFS="." Separator pola wyjściowego w awk, używany do rekonstrukcji nazwy pliku bez rozszerzenia.
NF-- Zmniejsza liczbę pól o jeden w awk, skutecznie usuwając rozszerzenie.
${BASH_REMATCH} Tablica przechowująca dopasowania z wyrażenia regularnego w języku Bash.
local variable Deklaruje zmienną o zasięgu lokalnym w ramach funkcji w Bash.

Szczegółowy podział rozwiązań Bash

Dostarczone skrypty oferują różne metody oddzielania nazwy pliku od jego rozszerzenia w Bash. Pierwszy skrypt wykorzystuje rozwinięcie parametrów Bash. Zmienna ${FILE%.*} usuwa rozszerzenie, usuwając wszystko od ostatniej kropki do końca łańcucha, while ${FILE##*.} przechwytuje rozszerzenie, biorąc wszystko po ostatniej kropce. Ta metoda jest prosta i wydajna w przypadku większości struktur nazw plików. Drugi skrypt wykorzystuje awk, potężne narzędzie do przetwarzania tekstu w środowiskach uniksowych. Ustawiając separator pól na kropkę za pomocą -F., pozwala na podzielenie nazwy pliku na części. Separator pola wyjściowego, OFS="."i zmniejszenie liczby pól za pomocą NF-- to techniki ponownego składania nazwy pliku bez jej rozszerzenia.

Trzeci skrypt wykorzystuje wyrażenia regularne w języku Bash, wykorzystując je ${BASH_REMATCH} do przechwytywania grup w dopasowaniu wyrażeń regularnych. Skrypt ten wykorzystuje wzorzec dzielący nazwę pliku na dwie grupy: jedną dla nazwy podstawowej i jedną dla rozszerzenia. Wreszcie niestandardowy skrypt funkcji hermetyzuje logikę rozszerzania parametrów w funkcji, zwiększając możliwość ponownego użycia i czytelność kodu. To używa local variable deklaracje utrzymujące zmienne w zasięgu funkcji, zapobiegając niezamierzonym efektom ubocznym w większych skryptach. Każda metoda demonstruje inne podejście do rozwiązania tego samego problemu, ukazując wszechstronność i moc skryptów Bash.

Korzystanie z rozwijania parametrów w Bash

Skrypty w Bashu

#!/bin/bash
# Script to extract filename and extension using parameter expansion
FILE="a.b.js"
FILENAME="${FILE%.*}"
EXTENSION="${FILE##*.}"
echo "Filename: $FILENAME"
echo "Extension: $EXTENSION"

Używanie Awk do oddzielenia nazwy pliku i rozszerzenia

Bash z Awk

#!/bin/bash
# Script to extract filename and extension using awk
FILE="a.b.js"
FILENAME=$(echo "$FILE" | awk -F. '{OFS="."; NF--; print $0}')
EXTENSION=$(echo "$FILE" | awk -F. '{print $NF}')
echo "Filename: $FILENAME"
echo "Extension: $EXTENSION"

Używanie wyrażeń regularnych w Bashu

Skrypty Bash z wyrażeniem regularnym

#!/bin/bash
# Script to extract filename and extension using regex
FILE="a.b.js"
[[ "$FILE" =~ (.*)\.(.*) ]]
FILENAME=${BASH_REMATCH[1]}
EXTENSION=${BASH_REMATCH[2]}
echo "Filename: $FILENAME"
echo "Extension: $EXTENSION"

Korzystanie z funkcji niestandardowej w Bash

Skrypty Bash z funkcją niestandardową

#!/bin/bash
# Function to extract filename and extension
extract_filename_extension() {
  local file="$1"
  echo "Filename: ${file%.*}"
  echo "Extension: ${file##*.}"
}
# Call the function with a file
extract_filename_extension "a.b.js"

Odkrywanie alternatywnych metod manipulacji plikami w Bash

Oprócz omówionych już metod, w Bash istnieją inne przydatne techniki manipulowania nazwami plików i rozszerzeniami. Jedna z takich metod polega na użyciu basename I dirname polecenia. basename można użyć do wyodrębnienia nazwy pliku ze ścieżki, podczas gdy dirname pobiera ścieżkę katalogu. Połączenie tych poleceń z rozwijaniem parametrów może skutecznie oddzielić nazwy plików i rozszerzenia. Na przykład za pomocą basename "$FILE" ".${FILE##*.}" usuwa rozszerzenie z nazwy pliku. To podejście jest szczególnie przydatne podczas pracy z pełnymi ścieżkami plików, a nie tylko nazwami plików.

Inna metoda polega na użyciu sed, potężny edytor strumieniowy do filtrowania i przekształcania tekstu. Tworząc odpowiednie wyrażenia regularne, sed może wyizolować nazwę pliku i rozszerzenie. Na przykład polecenie echo "$FILE" | sed 's/\(.*\)\.\(.*\)/\1 \2/' dzieli nazwę pliku i rozszerzenie, umieszczając je w oddzielnych grupach przechwytywania. Ta technika jest elastyczna i może obsługiwać złożone struktury nazw plików. Poznawanie tych dodatkowych narzędzi i metod rozszerza możliwości manipulowania danymi plików w Bash, zapewniając niezawodne rozwiązania dla różnych scenariuszy skryptowych.

Często zadawane pytania dotyczące manipulacji plikami Bash

  1. Jaki jest cel ${FILE%.*} Komenda?
  2. Usuwa rozszerzenie z nazwy pliku, usuwając wszystko po ostatniej kropce.
  3. W jaki sposób ${FILE##*.} polecenie pracy?
  4. Wyodrębnia rozszerzenie, pobierając wszystko po ostatniej kropce w nazwie pliku.
  5. Co robi awk -F. zrobić w dostarczonym skrypcie?
  6. Ustawia separator pól na kropkę, umożliwiając podzielenie nazwy pliku na części.
  7. Po co używać NF-- w awk scenariusz?
  8. Zmniejsza liczbę pól o jeden, skutecznie usuwając rozszerzenie z nazwy pliku.
  9. W jaki sposób wyrażenia regularne pomagają w wyodrębnianiu nazwy pliku i rozszerzenia?
  10. Umożliwiają dopasowywanie wzorców i grupowanie, co pozwala izolować różne części nazwy pliku.
  11. Jaka jest korzyść z używania funkcji niestandardowej w Bash?
  12. Funkcja niestandardowa zwiększa możliwość ponownego wykorzystania i czytelność kodu, czyniąc skrypty bardziej modułowymi.
  13. Jak basename pomoc z nazwami plików?
  14. Wyodrębnia nazwę pliku z pełnej ścieżki pliku, opcjonalnie usuwając rozszerzenie.
  15. Móc sed być używany do manipulacji nazwami plików?
  16. Tak, sed może używać wyrażeń regularnych do przekształcania i izolowania części nazw plików.

Podsumowanie rozwiązań do wyodrębniania nazw plików i rozszerzeń

Podsumowując, wyodrębnianie nazw plików i rozszerzeń w Bash można skutecznie osiągnąć różnymi metodami, z których każda jest dostosowana do różnych potrzeb i preferencji. Niezależnie od tego, czy używasz funkcji rozwijania parametrów, awk, sed czy funkcji niestandardowych, techniki te oferują elastyczne i wydajne rozwiązania. Zrozumienie i wykorzystanie tych poleceń gwarantuje, że skrypty będą mogły bezbłędnie obsługiwać nazwy plików zawierające wiele kropek i inne złożoności.