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 bashrozwią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.
$PWDzamiast uruchamiać polecenie.
Zastosowanie basename:
echo $(basename /foo/bar/stuff)
echo? basenamejuż drukuje wyniki. echomoż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 lspodczas 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;
lszawiera 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 echomoże się nie powieść, jeśli nazwa pliku jest łącznikiem + litera lub zawiera ukośnik odwrotny. OTOH ls -1 /path/to/dirsam z siebie niezawodnie drukuje każdą nazwę pliku w linii, modulo różnicę plików dot.