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.
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
:Cudzysłowy są potrzebne w przypadku, gdy $ filename zawiera np. Spacje.
źródło
$()
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
:źródło
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 drukowaniewith 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:
Jeśli uruchamiasz skrypt w tym samym katalogu, w którym znajdują się pliki, staje się on po prostu:
źródło
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łokiecho
może się nie powieść, jeśli nazwa pliku jest łącznikiem + litera lub zawiera ukośnik odwrotny. OTOHls -1 /path/to/dir
sam z siebie niezawodnie drukuje każdą nazwę pliku w linii, modulo różnicę plików dot.jeśli chcesz tylko nazwę pliku:
Więcej informacji na temat
cut
polecenia można znaleźć tutaj .źródło