Làm cách nào để chỉ lặp lại tên tệp của tệp nếu tôi lặp lại thư mục với vòng lặp for?
for filename in /home/user/*
do
echo $filename
done;
sẽ kéo đường dẫn đầy đủ với tên tệp. Tôi chỉ muốn tên tệp.
Làm cách nào để chỉ lặp lại tên tệp của tệp nếu tôi lặp lại thư mục với vòng lặp for?
for filename in /home/user/*
do
echo $filename
done;
sẽ kéo đường dẫn đầy đủ với tên tệp. Tôi chỉ muốn tên tệp.
Câu trả lời:
Nếu bạn muốn một bash
giải pháp gốc
for file in /home/user/*; do
echo "${file##*/}"
done
Ở trên sử dụng Mở rộng tham số có nguồn gốc từ trình bao và không yêu cầu lệnh gọi đến tệp nhị phân bên ngoài, chẳng hạn nhưbasename
Tuy nhiên, tôi có thể đề nghị chỉ sử dụng find
find /home/user -type f -printf "%f\n"
${file##*/}
để "${file##*/}"
hỗ trợ tên tệp có dấu cách, ví dụ: "Tên tệp của tôi có dấu cách.txt".
Chỉ cần sử dụng basename
:
echo `basename "$filename"`
Dấu ngoặc kép là cần thiết trong trường hợp $ filename chứa khoảng trắng, ví dụ.
$()
như Oli đã làm
/test 1
, basename $(pwd)
đầu ra: test
. Đã thử nghiệm trên OS X và Ubuntu Server (14.04). Giải pháp bash gốc, như @SiegeX đề xuất, là giải pháp phù hợp với tôi.
basename "$(pwd)"
thay thế.
$PWD
thay vì chạy lệnh.
Sử dụng basename
:
echo $(basename /foo/bar/stuff)
echo
? basename
đã in kết quả. echo
thậm chí có thể làm hỏng kết quả nếu bạn không trích dẫn vỏ con. Ví dụ: echo $(basename path/with\ \ spaces)
in sai with spaces
(chỉ một khoảng trắng).
Một cách tiếp cận khác là sử dụng ls
khi đọc danh sách tệp trong một thư mục để cung cấp cho bạn những gì bạn muốn, tức là "chỉ tên tệp / s". Trái ngược với việc đọc đường dẫn tệp đầy đủ và sau đó giải nén thành phần "tên tệp" trong phần thân của vòng lặp for.
Ví dụ bên dưới theo bản gốc của bạn:
for filename in $(ls /home/user/)
do
echo $filename
done;
Nếu bạn đang chạy tập lệnh trong cùng một thư mục với các tệp, thì nó chỉ đơn giản là:
for filename in $(ls)
do
echo $filename
done;
ls
bao gồm bất kỳ tệp dotfiles nào mà *
việc mở rộng thường không. Cũng for f in $(...) ...
không thành công nếu bất kỳ tên tệp nào chứa khoảng trắng trừ khi bạn đặt IFS, có thể không thành công nếu bất kỳ tên tệp nào chứa ký tự toàn cầu trừ khi bạn đặt -f / -o noglob và tùy thuộc vào hệ thống hoặc trình bao echo
có thể không thành công nếu bất kỳ tên tệp nào là gạch nối + chữ cái hoặc chứa dấu gạch chéo ngược. OTOH hoàn ls -1 /path/to/dir
toàn tự in một cách đáng tin cậy từng tên tệp trên một dòng, mô đun hóa sự khác biệt dotfiles.