Bạn cũng có thể sử dụng printf
lệnh, thay vì echo:
printf '%s\n' *
printf
là vượt trội so với echo
trong tình huống này ở chỗ echo
nào không tôn trọng các "dấu gạch ngang đôi" ( --
) để biểu thị sự kết thúc của danh sách đối số (trên một số hệ thống, bao gồm Ubuntu 14.04 mà là những gì tôi thử nghiệm nó trên):
llama@llama:~$ mkdir -p Misc/unix210948
llama@llama:~$ cd !$
cd Misc/unix210948
llama@llama:~/Misc/unix210948$ touch -- -n
llama@llama:~/Misc/unix210948$ ls
-n
llama@llama:~/Misc/unix210948$ echo *
llama@llama:~/Misc/unix210948$ echo -- *
-- -n
llama@llama:~/Misc/unix210948$ printf '%s\n' *
-n
Trong trường hợp này, bạn không thể đạt được kết quả mong muốn với echo
(vì một tệp được gọi là -n
được hiểu là một tùy chọn và dấu gạch ngang kép không hoạt động, vì vậy bạn phải sử dụng printf
).
Lưu ý rằng bạn phải luôn sử dụng chuỗi định dạng như trên khi xử lý dữ liệu không xác định printf
, vì nếu không, bạn có thể nhận được kết quả không mong muốn (cảm ơn @ G-Man đã chỉ ra điều này trong các nhận xét!):
llama@llama:~/Misc/unix210948$ rm ./-n
llama@llama:~/Misc/unix210948$ touch '\n'
llama@llama:~/Misc/unix210948$ ls
\n
llama@llama:~/Misc/unix210948$ printf -- *
llama@llama:~/Misc/unix210948$ printf '%s\n' *
\n
Một tập tin được gọi \n
được hiểu là một dòng mới bởi printf
. Để tránh điều này, chúng tôi sử dụng một chuỗi định dạng cho printf
( %s
) và truyền cho nó tên của các tệp (được mở rộng thông qua toàn cầu hóa, như trước đây).
printf
Giải pháp chuỗi định dạng + này có thể xử lý nhiều tên tệp (và cũng xử lý các tệp "ẩn", nghĩa là, các tệp bắt đầu bằng a .
, giống như ls
):
llama@llama:~/Misc/unix210948$ rm ./*
zsh: sure you want to delete all the files in /home/llama/Misc/unix210948/. [yn]? y
llama@llama:~/Misc/unix210948$ touch -- '-n' '\n' 'name with spaces' '.hidden'
llama@llama:~/Misc/unix210948$ ls
-n \n name with spaces
llama@llama:~/Misc/unix210948$ printf '%s\n' *
-n
\n
name with spaces
Nếu printf
hỗ trợ của bạn %q
, bạn cũng có thể sử dụng ( printf '%q\n' *
). Điều này sẽ thoát khỏi không gian, dòng mới, vv nếu có bất kỳ ký tự lạ nào trong tên tệp của bạn. (Cảm ơn @muru trong trò chuyện vì đã chỉ ra điều này !)
libc*so
hỏng hoặc của bạnld-linux*so