Bagaimana cara menggemakan hanya nama file dari file jika saya mengulang direktori dengan loop for?
for filename in /home/user/*
do
echo $filename
done;
akan menarik jalur lengkap dengan nama file. Saya hanya ingin nama file.
Bagaimana cara menggemakan hanya nama file dari file jika saya mengulang direktori dengan loop for?
for filename in /home/user/*
do
echo $filename
done;
akan menarik jalur lengkap dengan nama file. Saya hanya ingin nama file.
Jawaban:
Jika Anda menginginkan bash
solusi asli
for file in /home/user/*; do
echo "${file##*/}"
done
Di atas menggunakan Ekspansi Parameter yang merupakan bawaan dari shell dan tidak memerlukan panggilan ke biner eksternal sepertibasename
Namun, mungkin saya sarankan untuk menggunakan find
find /home/user -type f -printf "%f\n"
${file##*/}
untuk mengubah ke "${file##*/}"
untuk mendukung nama file dengan spasi misalnya "Nama file saya dengan spasi.txt".
Gunakan saja basename
:
echo `basename "$filename"`
Tanda kutip diperlukan jika $ filename berisi misalnya spasi.
$()
seperti yang dilakukan Oli
/test 1
, basename $(pwd)
keluaran: test
. Diuji di OS X dan Server Ubuntu (14.04). Solusi bash asli, seperti yang direkomendasikan @SiegeX, adalah yang berhasil untuk saya.
basename "$(pwd)"
sebagai gantinya.
$PWD
daripada menjalankan perintah.
Penggunaan basename
:
echo $(basename /foo/bar/stuff)
echo
? basename
sudah print hasilnya. echo
bahkan mungkin mengacaukan hasilnya jika Anda tidak mengutip subkulit. Contoh: echo $(basename path/with\ \ spaces)
salah mencetak with spaces
(hanya satu spasi).
Pendekatan lain adalah dengan menggunakan ls
saat membaca daftar file dalam direktori untuk memberikan apa yang Anda inginkan, yaitu "hanya nama file / s". Berbeda dengan membaca path file lengkap dan kemudian mengekstrak komponen "nama file" di badan loop for.
Contoh di bawah ini yang mengikuti yang asli Anda:
for filename in $(ls /home/user/)
do
echo $filename
done;
Jika Anda menjalankan skrip di direktori yang sama dengan file, maka skrip menjadi:
for filename in $(ls)
do
echo $filename
done;
ls
menyertakan dotfiles apa pun yang *
biasanya tidak dilakukan ekspansi. Juga for f in $(...) ...
gagal jika nama file apa pun berisi spasi kecuali Anda menyetel IFS, mungkin gagal jika nama file apa pun berisi karakter glob kecuali Anda menyetel -f / -o noglob, dan bergantung pada sistem atau shell echo
mungkin gagal jika nama file berupa tanda hubung + huruf atau berisi garis miring terbalik. OTOH ls -1 /path/to/dir
dengan sendirinya secara andal mencetak setiap nama file pada satu baris, modulo perbedaan dotfiles.