W jaki sposób mogę wyświetlić tylko nazwę pliku, jeśli iteruję katalog z pętlą for?
for filename in /home/user/*
do
echo $filename
done;
ściągnie pełną ścieżkę z nazwą pliku. Chcę tylko nazwę pliku.
W jaki sposób mogę wyświetlić tylko nazwę pliku, jeśli iteruję katalog z pętlą for?
for filename in /home/user/*
do
echo $filename
done;
ściągnie pełną ścieżkę z nazwą pliku. Chcę tylko nazwę pliku.
Odpowiedzi:
Jeśli chcesz mieć natywne bash
rozwiązanie
for file in /home/user/*; do
echo "${file##*/}"
done
Powyższe wykorzystuje rozszerzenie parametrów, które jest natywne dla powłoki i nie wymaga wywołania zewnętrznego pliku binarnego, takiego jakbasename
Mogę jednak zasugerować użycie find
find /home/user -type f -printf "%f\n"
${file##*/}
na, "${file##*/}"
aby obsługiwać nazwy plików ze spacjami, np. „Moja nazwa pliku ze spacjami.txt”.
Po prostu użyj basename
:
echo `basename "$filename"`
Cudzysłowy są potrzebne w przypadku, gdy $ filename zawiera np. Spacje.
$()
tak, jak zrobił to Oli
/test 1
, basename $(pwd)
Wydajność: test
. Przetestowano na OS X i Ubuntu Server (14.04). Natywne rozwiązanie bash, zgodnie z zaleceniami @SiegeX, działa dla mnie.
basename "$(pwd)"
zamiast tego.
$PWD
zamiast uruchamiać polecenie.
Zastosowanie basename
:
echo $(basename /foo/bar/stuff)
echo
? basename
już drukuje wyniki. echo
może nawet zmienić wynik, jeśli nie zacytujesz podpowłoki. Przykład: echo $(basename path/with\ \ spaces)
niepoprawne drukowanie with spaces
(tylko jedna spacja).
Innym podejściem jest użycie ls
podczas czytania listy plików w katalogu, aby uzyskać to, czego chcesz, tj. „Tylko nazwy plików”. W przeciwieństwie do odczytywania pełnej ścieżki pliku, a następnie wyodrębniania składnika „nazwa pliku” w treści pętli for.
Poniższy przykład zgodny z oryginałem:
for filename in $(ls /home/user/)
do
echo $filename
done;
Jeśli uruchamiasz skrypt w tym samym katalogu, w którym znajdują się pliki, staje się on po prostu:
for filename in $(ls)
do
echo $filename
done;
ls
zawiera wszystkie pliki dotfile, których *
rozszerzenie zwykle nie obejmuje. for f in $(...) ...
Niepowodzenie również, jeśli jakakolwiek nazwa pliku zawiera białe znaki, chyba że ustawisz IFS, może się nie powieść, jeśli jakakolwiek nazwa pliku zawiera znak globalny, chyba że ustawisz -f / -o noglob, aw zależności od systemu lub powłoki echo
może się nie powieść, jeśli nazwa pliku jest łącznikiem + litera lub zawiera ukośnik odwrotny. OTOH ls -1 /path/to/dir
sam z siebie niezawodnie drukuje każdą nazwę pliku w linii, modulo różnicę plików dot.