Cách xử lý khoảng trắng trong tên tệp trên Linux

Tác giả sysadmin, T.M.Một 08, 2023, 01:31:08 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 2 Khách đang xem chủ đề.

Cách xử lý khoảng trắng trong tên tệp trên Linux


Khoảng cách ra, nhưng không bong tróc. Nếu tên tệp của bạn có khoảng trắng trên hệ thống Linux, việc đặt tên tệp của bạn trong dấu ngoặc kép sẽ giúp Bash xử lý tên tệp đó một cách chính xác. Việc hoàn thành tab giúp việc nhập tên tệp trên dòng lệnh trở nên dễ dàng, ngay cả khi chúng chứa dấu cách.

Giống như hầu hết các hệ điều hành, Linux hỗ trợ tên tệp có khoảng trắng trong đó. Nhưng việc sử dụng những tên tệp này trên dòng lệnh không phải lúc nào cũng đơn giản. Dưới đây là một số cách bạn có thể xử lý tên tệp chứa dấu cách.

1. Tên tệp Linux hoạt động như thế nào?

Mọi thứ được lưu trữ trên ổ cứng máy tính của bạn đều cần phải có tên. Không có tên thì sẽ không có tập tin nào tồn tại. Tất cả các ứng dụng và daemon được khởi chạy khi máy tính của bạn khởi động cũng như tất cả phần mềm bạn sử dụng đều phải được xác định và lưu trữ trong hệ thống tệp. Nhận dạng đó là tên của tập tin.'

Điều tương tự cũng áp dụng cho các tệp bạn tạo hoặc cài đặt. Tất cả tài liệu, hình ảnh và nhạc của bạn đều cần tên tệp. Không có tên tệp, không tài sản kỹ thuật số nào của bạn có thể tồn tại. Bởi vì tên tập tin rất quan trọng nên Linux cố gắng hết sức để áp đặt càng ít quy tắc về thành phần của chúng càng tốt.

Trên Linux, tên tệp có thể chứa bất kỳ ký tự nào ngoài dấu gạch chéo lên "/" và ký tự null, 0x00. Ký tự null được sử dụng để đánh dấu sự kết thúc của một chuỗi, vì vậy nó không thể xuất hiện trong chính chuỗi đó hoặc Linux sẽ cắt bớt tên tệp ở vị trí của ký tự null. Dấu gạch chéo "/" được sử dụng làm dấu phân cách trong đường dẫn thư mục.

Tên tệp phân biệt chữ hoa chữ thường và có thể dài tới 255 byte, bao gồm cả ký tự null. Đường dẫn thư mục có thể dài tới 4096 byte, bao gồm cả ký tự null. Lưu ý rằng đây là độ dài của chúng tính bằng byte, có thể không tương đương trực tiếp với các ký tự. Ví dụ: các ký tự Unicode 16 bit, mỗi ký tự có hai byte.

Những người đam mê máy tính cổ điển và những người có trí nhớ lâu dài sẽ biết rằng trong những ngày đầu của máy tính cá nhân, Hệ điều hành Đĩa của Microsoft, DOS, không phân biệt chữ hoa chữ thường và có giới hạn tên tệp là tám ký tự, cộng với phần mở rộng ba ký tự.

Bạn phải rất chu đáo và đôi khi phải sáng tạo khi đặt tên cho các tập tin. Để so sánh, sự tự do mà chúng ta có ngày nay có nghĩa là chúng ta có thể đặt tên tệp bất cứ thứ gì chúng ta muốn mà không cần phải suy nghĩ đến bất kỳ điều gì khác ngoài mô tả mà chúng ta đang tạo cho tệp đó.

Nhưng với tên tập tin, điều khiến chúng ta bối rối nhất không phải là các ký tự chúng ta gõ mà là khoảng cách giữa chúng.

2. Tại sao khoảng trắng trong tên tệp Linux lại gây khó khăn

Các shell như Bash sẽ diễn giải một chuỗi từ được phân tách bằng dấu cách dưới dạng các đối số lệnh riêng lẻ chứ không phải một đối số duy nhất. Đây là một ví dụ, sử dụng touchđể tạo một tệp mới có tên "my new file.txt."

Mã nguồn [Chọn]
touch my new file.txt
Mã nguồn [Chọn]
ls

Như chúng ta có thể thấy, ls cho chúng ta thấy rằng có ba tệp được tạo, một tệp có tên là "của tôi", một tệp khác có tên là "mới" và một tệp khác có tên là "file.txt".

Lưu ý rằng touch không phàn nàn hoặc đưa ra lỗi. Nó thực hiện những gì nó cho là chúng ta yêu cầu nó làm. Vì vậy, nó âm thầm đưa chúng ta trở lại dòng lệnh. Nếu chúng ta không có động lực để kiểm tra, chúng ta sẽ không biết mọi việc không diễn ra theo đúng kế hoạch.

Để tạo tệp mà chúng tôi muốn, chúng tôi phải trích dẫn hoặc thoát.

3. Cách trích dẫn và thoát khỏi không gian

Nếu chúng tôi trích dẫn toàn bộ tên tệp, touch biết rằng nó cần coi văn bản được trích dẫn là một đối số duy nhất.

Mã nguồn [Chọn]
touch 'my new file.txt'
Mã nguồn [Chọn]
ls

Lần này chúng tôi nhận được tập tin duy nhất mà chúng tôi mong đợi.

Chúng ta có thể nhận được kết quả tương tự nếu sử dụng ký tự dấu gạch chéo ngược " \" để thoát khỏi khoảng trắng. Bằng cách "thoát" các khoảng trắng, chúng không được coi là các ký tự đặc biệt — nghĩa là các dấu phân tách đối số — chúng được coi là các khoảng trắng đơn giản cũ.

Mã nguồn [Chọn]
touch my\ second\ new\ file.txt
Mã nguồn [Chọn]
ls

Cách đó có tác dụng nhưng việc thoát khỏi khoảng trắng khiến việc nhập tên tệp chậm hơn và dễ xảy ra lỗi. Mọi thứ có thể trở nên thực sự tồi tệ nếu bạn có tên thư mục có khoảng trắng trong đó.

Mã nguồn [Chọn]
cp dir one/my\ text\ file.txt dir\ two/my\ text file.bak
Mã nguồn [Chọn]
ls

Lệnh đó sao chép một tệp văn bản từ thư mục có tên "dir one" sang thư mục có tên "dir two" và lưu bản sao dưới dạng tệp BAK. Và đó là một ví dụ khá đơn giản.

4. Cách khắc phục sự cố không gian tại nguồn của nó

Nếu đó là các tệp của riêng bạn, bạn có thể đưa ra quyết định về chính sách là không bao giờ sử dụng dấu cách và tạo (hoặc đổi tên hàng loạt) tên tệp như thế này.

Mã nguồn [Chọn]
mynewtextfile.txt
Phải thừa nhận rằng đó là một giải pháp mạnh mẽ nhưng nó vẫn còn tệ. Có những lựa chọn tốt hơn, chẳng hạn như sử dụng dấu gạch ngang " -" hoặc dấu gạch dưới " _" để phân tách các từ của bạn.

Mã nguồn [Chọn]
my-new-text-file.txt
Mã nguồn [Chọn]
my_new_text_file.txt
Cả hai điều này sẽ tránh được vấn đề và chúng có thể đọc được. Nếu bạn không muốn thêm ký tự bổ sung vào tên tệp của mình, bạn có thể sử dụng CamelCase để làm cho tên tệp của bạn có thể đọc được, như sau:

Mã nguồn [Chọn]
MyNewTextFile.txt
5. Mở rộng tab giúp xử lý không gian dễ dàng

Tất nhiên, việc áp dụng quy ước đặt tên và tuân thủ nó sẽ chỉ hữu ích khi bạn xử lý các tệp của riêng mình. Các tệp đến từ bất kỳ nơi nào khác khó có thể tuân theo quy ước đặt tên đã được thông qua của bạn.

Bạn có thể sử dụng tính năng mở rộng tab để giúp bạn "điền" chính xác tên file cho chúng tôi. Giả sử chúng tôi muốn xóa tệp BAK mà chúng tôi đã tạo trong "dir two", sử dụng rm.

Chúng tôi bắt đầu bằng cách nhập "rm dir" vì chúng tôi đang sử dụng lệnh rmvà chúng tôi biết tên thư mục bắt đầu bằng "dir".

Mã nguồn [Chọn]
rm dir
Nhấn phím "Tab" sẽ khiến Bash quét các kết quả khớp trong thư mục hiện tại.


Có hai thư mục bắt đầu bằng "dir" và trong cả hai trường hợp, ký tự tiếp theo là khoảng trắng. Vì vậy Bash thêm ký tự dấu gạch chéo ngược "\" và một khoảng trắng. Bash sau đó đợi chúng tôi cung cấp nhân vật tiếp theo. Nó cần ký tự tiếp theo để phân biệt giữa hai kết quả phù hợp có thể có trong thư mục này.

Chúng ta sẽ nhập chữ "t" cho "hai" rồi nhấn "Tab" một lần nữa.


Bash hoàn thành tên thư mục cho chúng tôi và đợi chúng tôi nhập phần đầu của tên tệp.

Chúng tôi chỉ có một tệp trong thư mục này, vì vậy việc gõ chữ cái đầu tiên của tên tệp, "m", là đủ để cho Bash biết chúng tôi muốn sử dụng tệp nào. Nhập "m" và nhấn "Tab" sẽ hoàn thành tên tệp cho chúng tôi và "Enter" sẽ thực thi toàn bộ lệnh.


Tính năng mở rộng tab giúp bạn dễ dàng đảm bảo đặt đúng tên tệp và cũng tăng tốc độ điều hướng và nhập dòng lệnh nói chung.

6. Cách sử dụng tên tệp có dấu cách trong tập lệnh Bash

Không có gì ngạc nhiên khi các tập lệnh có cùng một vấn đề với khoảng trắng trong tên tệp giống như dòng lệnh. Nếu bạn chuyển tên tệp dưới dạng biến, hãy đảm bảo bạn trích dẫn tên biến.

Tập lệnh nhỏ này kiểm tra thư mục hiện tại để tìm các tệp khớp với mẫu tệp "*.txt" và lưu trữ chúng trong một biến có tên file_list. Một forvòng lặp được sử dụng để thực hiện một hành động đơn giản trên mỗi vòng lặp.

Mã nguồn [Chọn]
#!/bin/bashfile_list=*.txtfor file in $file_listdo ls -hl $filedone
Sao chép văn bản này vào trình soạn thảo và lưu nó vào tệp có tên "files.sh." Sau đó sử dụng lệnhchmod để làm cho nó có thể thực thi được.

Mã nguồn [Chọn]
chmod +x file.sh
Chúng tôi có một số tập tin trong thư mục này. Một cái có tên tệp đơn giản và hai cái còn lại sử dụng dấu gạch dưới " _" hoặc dấu gạch ngang " -" thay vì dấu cách. Đây là những gì chúng ta thấy khi chạy tập lệnh.

Mã nguồn [Chọn]
./files.sh

Điều đó dường như hoạt động tốt. Nhưng hãy thay đổi các tệp trong thư mục thành các tệp chứa khoảng trắng trong tên của chúng.

Mã nguồn [Chọn]
./files.sh

Mỗi từ trong mỗi tên tệp được xử lý như thể đó là tên tệp riêng và do đó tập lệnh không thành công. Nhưng tất cả những gì chúng ta cần làm để làm cho tập lệnh xử lý khoảng trắng trong tên tệp là trích dẫn $file biến bên trong for vòng lặp.

Mã nguồn [Chọn]
#!/bin/bashfile_list=*.txtfor file in $file_listdols -hl "$file"done
Lưu ý rằng ký hiệu đô la " $" nằm trong dấu ngoặc kép. Chúng tôi đã thực hiện thay đổi đó và lưu nó vào tệp tập lệnh "files.sh". Lần này, tên tập tin được xử lý chính xác.

Mã nguồn [Chọn]
./files.sh

7. Khoảng cách nhưng không bong tróc

Việc tránh khoảng trắng trong tên tệp của riêng bạn sẽ chỉ đưa bạn đi xa hơn. Không thể tránh khỏi việc bạn sẽ gặp phải các tệp từ các nguồn khác có tên chứa dấu cách. Rất may, nếu bạn cần xử lý các tệp đó trên dòng lệnh hoặc trong tập lệnh, có nhiều cách dễ dàng để thực hiện việc đó.