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 bashsolusi 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.
$PWDdaripada menjalankan perintah.
Penggunaan basename:
echo $(basename /foo/bar/stuff)
echo? basenamesudah print hasilnya. echobahkan 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 lssaat 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;
lsmenyertakan 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 echomungkin gagal jika nama file berupa tanda hubung + huruf atau berisi garis miring terbalik. OTOH ls -1 /path/to/dirdengan sendirinya secara andal mencetak setiap nama file pada satu baris, modulo perbedaan dotfiles.