Tải bản đầy đủ (.doc) (18 trang)

bài 2 Làm quen với Linux command

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (627.12 KB, 18 trang )

© Trần Huy Thắng. tài liệu Linux cho sv DH NN, không phát tán lên Internet.
Đây là bản nháp viết gấp, nếu người đọc phát hiện sai sót xin thông báo cho người viết.
Bài 2. Làm quen với Linux command
Bài 2. Làm quen với Linux command 1
1. Đăng nhập và tắt máy 1
2. Kernel, Shell 3
3. Virtual Console và Terminal 3
4. Lệnh trong Linux 4
a. Cách viêt lệnh 4
b. Thực thi executable file 4
c. Shell script 5
d. Metacharacters 5
e. Help 5
f. History 6
4. su 6
5. Các thao tác quen thuộc với File và thư mục 6
a. Cấu trúc file và thư mục của Linux khác với của Windows 6
b. Các lệnh xem, tạo mới, xóa, di chuyển, đổi tên file và thư mục 7
c. Midnight Commander (mc) 9
d. Link 10
e. Archive và Compress file 10
f. Tìm kiếm file và thư mục 11
6. Filesystem Hierarchy standard 12
7. Khái niệm file theo nghĩa rộng trong UNIX/Linux 13
8. Redirection và xargs 14
a. Redirect stdin, stdout, stderr to file (phần này viết khó hiểu, phải bỏ bớt đi) 14
b. Pipe và kết hợp với grep, wc, sort, less 16
c. xargs 16
9. VIM editor 16
10. Regular expression 17
1. Đăng nhập và tắt máy


Linux là hệ thống đa người sử dụng nên khi khởi động bạn phải cho biết định danh của mình trên hệ thống
qua màn đăng nhập.
- Có thể có 3 màn hình đăng nhập như dưới đây:
• Giao diện đồ họa: Nếu Linux được cài KDE, GNOME thì bạn có giao diện đăng nhập đồ họa. Mỗi
distro sẽ có một màn đăng nhập riêng, chả hạn như hình vẽ dưới đây của SUSE.
1/18
• Giao diện dòng lệnh: Trên các server, giao diện đồ họa thường không được cài (hoặc cài nhưng
disable) để đỡ tốn tài nguyên (CPU, RAM), lúc đó bạn phải làm việc với giao diện dòng lệnh virtual
console.
• Đăng nhập từ xa: Người quản trị mạng không phải lúc nào cũng phải đến trực tiếp Linux server để
điều khiển mà có thể đăng nhập từ một máy Windows thông qua công cụ (chả hạn như) Putty.
- Có 2 loại người sử dụng: root (còn gọi là super user) và normal user (người sử dụng thường). Một hệ
thống chỉ có đúng một tài khoản root, tài khoản này có tất cả các quyền thao tác với hệ thống, nó chỉ dành
cho người quản trị hệ thống. Với người sử dụng thường, ngoài các quyền thao tác với chính tài liệu của họ
tạo ra thì có rất ít quyền với hệ thống. Đoạt root luôn là mục đích của các Linux hackers.
- Tắt máy là chuyện rất hạn chế của người quản trị server (thử tưởng tượng một web server mà tắt đi thì có
bao nhiêu người gặp bất tiện khi định vào trang web của server). Nếu bạn chỉ là người dùng Linux thông
thường, hiển nhiên thường phải restart hoặc shutdown; ở chế độ dòng lệnh dùng lệnh sau (chỉ có root mới
có quyền):
- Turn off: shutdow –h now
- Restart: shutdown –r now hoặc reboot
Nếu muốn hẹn giờ shutdown thì thay now bằng lượng thời gian chờ shutdown hh:mm hoặc mm.
Chú ý turn off/ restart một cách cơ học (không đúng cách), dù không gây hỏng hóc cho hệ thống thì lần sau
khi bật máy sẽ nhận được thông báo đòi check disk, chẳng hạn với Red hat là:
Press Y within 5 seconds to force file system integrity check …
2/18
2. Kernel, Shell
Kiến trúc phân tầng của một máy tính được cho trên hình vẽ.
Kernel (nhân) của hệ điều hành làm nhiệm vụ trực tiếp quản lý phần cứng.
Người sử dụng không thể trực tiếp ra lệnh cho kernel được vì các lệnh này liên

quan đến chi tiết của phần cứng, vô vùng phức tạp. Thay vào đó người dùng
gõ các lệnh của Shell (vỏ) vốn gần gũi với con người. Shell sẽ thông dịch
(interpret) các lệnh của người dùng thành các lệnh điều khiển kernel và đến
lượt kernel chuyển các yêu cầu đến nó thành các thao tác điều khiển phần
cứng.
Khi hệ thống khởi động, sau khi kernel được tải vào RAM thì shell sẽ được tải
tiếp theo.
Shell của DOS chính là command.com làm nhiệm vụ dịch các lệnh của người
sử dụng như dir, md, cd, … ra thành các lệnh máy.
Không có khái niệm shell của Windows nhưng ở một nghĩa trừu tượng nào đó
có thể coi giao diện đồ họa của Windows tương đương với shell của DOS.
Có nhiều loại shell cho Linux như C shell, Bourne Shell, … mỗi loại shell lại có tập lệnh riêng và người
dùng chỉ được phép gõ các lệnh trong tập lệnh đó. Phổ biến nhất hiện nay là BASH shell dùng trong
RedHat, Suseshell và DASH shell dùng trong Ubuntu. Tập lệnh của hai loại shell này hầu hết là giống nhau.
3. Virtual Console và Terminal
Như ở trên nói shell là trình thông dịch, chương trình virtual console hoặc terminal làm nhiệm vụ chuyển
các lệnh mà bạn gõ trên bàn phím vào cho shell dịch. Nói cách khác virtual console hoặc terminal là giao
diện để bạn tương tác với shell.
- Nếu hệ thống Linux không cài KDE, GNOM, mặc định bạn sẽ làm việc bằng giao diện dòng lệnh
virtual console. Linux có 6 virtual console, virtual console 1 được mặc định khi khởi động. Có thể
chuyển đổi qua lại giữa các virtual console bằng tổ hợp phím ALT + Fn (n = 1,2, …6). Người dùng
có thể chạy một chương trình ở virtual console này và không cần đợi cho kết thúc chuyển sang
virtual console khác để thực hiện một lệnh mới. Điều này tạo cảm giác có thể chạy nhiều chương
trình cùng lúc.
- Nếu hệ thống trong giao diện đồ họa. Bạn có thể vào menu Applications/Accessories/Terminal (các
distro sẽ có các bố trí menu khác) để chạy chương trình terminal cho phép bạn tương tác với shell.
Hoặc với một điều kiện nào đó có thể dùng CTRL + ALT + F6/F7 để chuyển qua lại giữa giao diện
đồ họa và các virtual console.
Dù là virtual console hay terminal, dấu nhắc dòng lệnh của nó có dạng, chẳng hạn
[root@localhost ~]# _

Ý nghĩa:
- tên account đang login: root, vì thế có dấu #, nếu là normal user có dấu $
- máy tính cài Linux mà user đang login: localhost để chỉ người dùng không login từ xa, nếu login từ
xa sẽ là tên/ip một máy tính từ xa nào đó.
- thư mục hiện hành: tên một thư mục hoặc nếu là dấu ~ thì chỉ thư mục home (nơi lưu dữ liệu cá
nhân) của người dùng
Nói thêm về nguồn gốc của từ “terminal”: “terminal” như ở đây là một chương trình giao tiếp với shell còn trong quá khứ nó là
một thiết bị phần cứng. Ở thời trước khi có máy tính cá nhân, chỉ có những hệ thống máy tính lớn đa người sử dụng. Người sử
dụng truy cập vào các hệ thống lớn này thông qua một thiết bị có tên là “terminal” chỉ gồm có bàn phím và màn hình, không có
bộ xử lý dữ liệu. Theo thời gian khi máy tính cá nhân ra đời nó thay thế các thiết bị này và người ta dùng phần mềm để mô phỏng
lại nó.
3/18
Shell
Kernel
Application
Hardware
user
4. Lệnh trong Linux
a. Cách viêt lệnh
Lệnh trong Linux thường có dạng: tên_lệnh tham_số đối_số
Trong đó tham số để điều chỉnh cách thực hiện lệnh còn đối số thường là đối tượng bị lệnh tác động lên.
Tham số, đối số có thể vắng mặt, trong cú pháp của lệnh nếu một thành phần nào đó có thể vắng mặt thì nó
được để trong dấu ngoặc vuông [ ], nếu buộc phải có mặt thì để trong dấu ngoặc nhọn <> hoặc để không. Ví
dụ cú pháp lệnh man là man [section] tên_lệnh.
Trước tham số thường phải có dấu gạch, đối số thì không cần. Tham số có 2 dạng:
Dạng ngắn bắt đầu bằng một dấu gạch ngang – ví dụ cp –r Dir1 Dir2
Dạng dài bắt đầu bằng hai dấu gạch ngang – – ví dụ cp – – recursive Dir1 Dir2
Hai lệnh trên là một, cùng copy Dir1 thành Dir2. Thường tham số dạng ngắn là viết tắt của dạng dài (r viết
tắt của recursive).
Có một số tham số nào đó rất nhiều lệnh hay dùng gần như thành qui ước, chẳng hạn:

– v hoặc – – verbose (tiếng Anh, “verbose” có nghĩa là “dài dòng”) dùng để hiển thị những thông tin
mô tả quá trình thực hiện lệnh.
– f hoặc – – force thực hiện lệnh mà không cần tương tác với người dùng
vv
Lệnh trong Linux phân biệt hoa thường nên tham số –v sẽ khác với –V.
Có thể viết nhiều lệnh trên cùng một dòng nhưng phải có dấu chấm phẩy (;) ở giữa
Ví dụ: mkdir /mnt/USB; mount /dev/sdb1 /mnt/USB; cd /mnt/USB
Có thể ngắt một lệnh thành nhiều dòng (để cho dễ theo dõi) bằng cách thêm dấu \ vào chỗ cần ngắt và enter.
b. Thực thi executable file
Khi người dùng gõ một lệnh thực chất là thực thi một executable file (file khả thi – như các file .exe của
Windows) nào đó có tên trùng với tên lệnh. Shell tìm executable file này (lệnh) trong 4 đường dẫn mặc định
là /bin, /sbin, /usr/bin, /usr/sbin, nếu không tìm thấy nó sẽ thông báo “command not found”. Các
đường dẫn mà shell cần tìm được lưu trong biến PATH của shell, người dùng có thể sửa biến này.
Lệnh which <command> cho biết chính xác file lệnh nằm dưới thư mục nào trong 4 thư mục mặc
định kia. Ví dụ: which mkdir cho biết /bin/mkdir
 lệnh mkdir myDirectory tương đương với lệnh /bin/mkdir myDirectory
Giả sử người dùng đang ở thư mục /home/userX, thư mục này chứa một executable file có tên là exefile.
Để thực thi file này, trong DOS người dùng chỉ cần gõ lệnh exefile là đủ, nhưng với Linux, shell sẽ thông
báo “command not found” lí do là biến PATH của DOS có chứa thư mục hiện hành còn của Linux thì
không. Với shell của Linux phải gõ lệnh ./exefile hoặc /home/userX/exefile tức là phải chỉ rõ
đường dẫn ra.
[root@localhost userX]# exefile
bash: exefile: command not found
[root@localhost userX]# ./exefile
[… OK …]
[root@localhost userX]# /home/userX/exefile
[… OK …]
Cũng nói thêm, trong DOS/Windows tên một executable file luôn có đuôi là .exe hoặc .com, nhưng trong
Linux không có đuôi nào đặc trưng cho một excutable file cả.
4/18

c. Shell script
Shell script là một plain text file chứa dãy các lệnh shell. Khi thực thi shell script thì dãy các lệnh trong nó
được thực thi. Shell script tương tự như file batch của DOS nhưng mạnh hơn rất nhiều. Người ta thường lấy
tên file shell script có đuôi là .sh nhưng điều này không bắt buộc.
Có 3 cách thực thi một shell script “myscript”
bash myscript
sh myscript
./myscript
Nhưng trước hết phải đảm bảo người gọi file có quyền thực thi “myscript”. Nếu là root có thể nhanh chóng
đặt quyền thực thi cho file bằng lệnh chmod +x myscript (xem thêm bài quản trị file permission)
d. Metacharacters
Một lệnh có thể chứa metacharacters (siêu kí tự) là các kí tự đặc biệt <, |, >, &, !, … và các loại dấu ngoặc
như ‘ , “, ` . Đây là những kí tự có ý nghĩa đặc biệt đối với shell khi thực hiện lệnh. Các metacharacters
thường (và nên luôn là như vậy) không được dùng để đặt tên. Có rất nhiều metacharacters, dưới đây là một
số hay dùng:
Wildcards (kí tự đại diện): * và ?
Dấu * đại diện cho một số lượng bất kì kí tự. Ví dụ: ls /root/b* liệt kê tất cả các file bắt đầu bằng 1 chữ ‘b’
Dấu ? đại diện cho đúng một kí tự bất kì. Ví dụ: ls /root/b? liệt kê tất cả các file có tên gồm 2 kí tự, kí tự
đầu tiên là ‘b’.
Ranges (miền): [ ] và {}
Cặp [ ] định nghĩa một miền giá trị. Thêm dấu ! trong cặp này để chỉ nằm ngoài miền.
Ví dụ 1: ls a[3-7][bx][b-x] liệt kê tất cả các file có tên gồm 4 kí tự, kí tự đầu là chữ ‘a’, kí tự thứ hai là 1
chữ số trong khoảng từ 3 đến 7, kí tự thứ ba là kí tự ‘b’ hoặc ‘x’, kí tự cuối là một kí tự trong khoảng b đến
x.
Ví dụ 2: ls [!Aa]* liệt kê tất cả các file có tên gồm ít nhất một kí tự, kí tự đầu không phải là ‘A’ hoặc ‘a’
Cặp { } liệt kê các giá trị có thể nhận.
Ví dụ: ls index.{htm, html} liệt kê các file có tên là index.htm hoặc index.html.
Escape codes: kí tự \ (back slash). Khi muốn dùng một metacharacter nào đó mà muốn shell không
hiểu nó là metacharacter thì thêm dấu \ đằng trước. Nếu muốn dùng chính dấu \ thì thành \\.
Ví dụ: mkdir Van\ ban\\Cong\ van tạo một thư mục có tên là “Van ban\Cong van”. Kí tự dấu cách và \

được dùng trong tên đều là metacharacters
Quotes: có các loại dấu ngoặc là ‘’, “”, `` (back tick). Khi dùng dấu ngoặc ‘’, “” thì tất cả các kí tự trong
dấu ngoặc được hiểu không phải là metacharacters. Vẫn với ví dụ trên, có thể chỉ cần:
mkdir “Van ban\Cong van” hoặc mkdir ‘Van ban\Cong van’. Sự khác nhau giữa ‘’, “” quá tinh tế tài
liệu này không đề cập đến.
Dấu `` thường được dùng khi viết lệnh shell, tài liệu này cũng không đề cập đến.
e. Help
Có vô cùng nhiều lệnh, mỗi lệnh lại có rất nhiều tham số, để giúp người dùng tra cứu, Linux có một tập các
manual (hướng dẫn sử dụng) về gần như tất cả các lệnh. Tập manual này được chia làm 8 section (mục):
1 General commands
2 System calls
5/18
3 C library functions
4 Special files (usually devices, those found in /dev) and drivers
5 File formats and conventions
6 Games and screensavers
7 Miscellanea
8 System administration commands and daemons
Để tra cứu một lện nào đó trong tập manual này dùng lệnh man <tên_lênh>. Khi trang man hiện ra,
người dùng có thể dùng các phím di chuyển←↑→↓, PgUp/Down để xem, muốn thoát ra bấm q.
Ở góc trang man có con số để trong ngoặc cho biết section của trang man đó. Có những lệnh thuộc nhiều
hơn 1 section ví dụ lệnh exit thuộc 3 section là (1), (2), (3) nhưng khi man chỉ ra một section, muốn tra cứu
lệnh đó trong các section khác dùng lệnh man section <tên_lênh> Ví dụ man 2 exit hoặc man 3
exit
Người ta dùng lệnh man trong trường hợp biết tên lệnh, quên tham số. Trong trường hợp quên cả tên lệnh,
nếu chỉ nhớ được vài chữ cái đầu tiên của lệnh hãy gõ vài chữ cái đầu đó rồi bấm phím Tab hai lần để hiển
thị danh sách những lệnh bắt đầu bằng các chữ cái đó. Khi không nhớ được các chữ cái đầu của lệnh thì
dùng lệnh apropos <môt cum tu nao đó> để tra cứu những lệnh nào có tên hoặc phần giải thích
liên quan đến <một cụm từ nào đó> (apropos tiếng anh có nghĩa là “liên quan đến”)
Lệnh man, apropos ở trên đều tra cứu trong tập man của Linux. Ngoài tập man của Linux thì bản thân mỗi

lệnh đã chứa thông tin giải thích về lệnh ngắn hơn so với man, muốn xem chỉ việc gõ tên lệnh và thêm tham
số - - help
f. History
Để lấy lại lệnh vừa gõ trước đó dùng phím ↑ hoặc ↓. Để liệt kê một số lệnh vừa gõ dùng lệnh history
4. su
Nếu là normal user thì bạn không thể thực thi các lệnh thao tác với hệ thống được, bạn có rất ít quyền. Khi
đang ở tài khoản normal user để chuyển sang tài khoản root (giả sử bạn có password của root) mà không
phải log out rồi lại log in thì tại dấu nhắc shell gõ lệnh su (substitute user – thay đổi user) sau đó gõ
password. Cũng có thể chuyển nhanh sang một tài khoản bất kì bằng lệnh su [-] [username]. Mỗi tài
khoản có một môi trường shell với những cấu hình shell riêng biệt, dùng dấu – trong lệnh su để đảm bảo các
cấu hình shell cũng được chuyển theo khi chuyển user.
5. Các thao tác quen thuộc với File và thư mục
a. Cấu trúc file và thư mục của Linux khác với của Windows
Trong Windows/DOS file và thư mục được lưu vào trong các partition (phân vùng) được đánh ký hiệu C:,
D:, … Mỗi partition sẽ có một thư mục gốc là C:\, D:\ … Trong Linux, chỉ có một thư mục gốc duy nhất
là /. Dưới / là các thư mục con và file, một số thư mục con nào đó được chọn làm “đầu nối” với các partition
khác. Thư mục được chọn đó được gọi là mount point, các partition sẽ được mount (“nối”) vào các mount
point. Như vậy người dùng Linux sẽ không có cảm giác rõ ràng về các partition của đĩa cứng mà chỉ thấy
một cây thư mục khổng lồ, một số nhánh nào đó của cây thư mục này sẽ dẫn đến một số partition khác.
Xét ví dụ minh họa sự khác nhau giữa cây thư mục của Windows và Linux như ở hình vẽ:
6/18
Giả sử máy tính có một ổ đĩa cứng và được chia làm 3 partitions: partition 1 chứa hệ điều hành, partition 2
chứa các tài liệu cho công việc (Works), partition 3 chứa phim, ảnh giải trí (Entertains).
- Nếu cài Windows, người dùng sẽ thấy rõ 3 partition: partition C: (nhãn “OS”) chứa Windows,
partition D: (nhãn “Work”) chứa tài liệu công việc, và partition E: (nhãn “Entertainment”) chứa
phim, ảnh giải trí.
- Nếu cài Linux, người dùng có cảm giác chỉ có 1 partition tên là “/” (đọc là partition root) chứa tất cả
mọi thứ từ hệ điều hành đến Entertains và Works. Kì thực vẫn là 3 partition nhưng giờ đây không
được kí hiệu là C, D, E nữa mà là hda1, hda2, hda3. Partition hda1 chứa hệ điều hành nhưng dĩ nhiên
file thư mục của Linux (boot, bin, home, usr, var, …) sẽ khác với Windows (Documents, Program

Files, Windows). Partition hda1 được mount vào /. Partition hda2, hda3 được mount vào một thư
mục trong partition hda1 mà ở đây là /mnt/Entertains và /mnt/Works.
Đường dẫn thư mục của Linux cũng giống như Windows ngoại trừ việc dùng dấu / thay vì dùng dấu \; ví
dụ trong Linux là /Dir/subDir thì tương ứng trong Windows là C:\Dir\subDir.
Cẩn thận với dấu / ! Khi nó nằm ở đầu một đường dẫn thì nó chỉ thư mục gốc và đường dẫn bắt đầu từ thư
mục gốc, người ta gọi đó là đường dẫn tuyệt đối. Khi đường dẫn không chứa dấu / ở đầu thì đường dẫn đó
bắt đầu từ thư mục hiện hành và được gọi là đường dẫn tương đối. Ví dụ: lệnh mkdir /Report (tạo thư mục
Report trong thư mục gốc /) sẽ khác với lệnh mkdir Report (tạo thư mục Report trong thư mục hiện hành).
b. Các lệnh xem, tạo mới, xóa, di chuyển, đổi tên file và thư mục
Khi mới đăng nhập, thư mục hiện hành là thư mục home của người đăng nhập. Thư mục home của người
sử dụng được dùng để lưu dữ liệu cá nhân của người sử dụng đó. Thư mục home của root là /root, của
normal user là /home/tên_user. Thư mục /home/ của Linux có phần giống Documents and Settings của
Windows NT)
Để xem thư mục hiện hành dùng lệnh pwd (present working directory). Để thay đổi thư mục hiện hành
dùng lệnh cd <đuong dân thu muc> (cd viết tắt của change directory). Thường kết hợp lệnh cd với
7/18
dấu chấm chấm ( ) để lên thư mục cha, đấu ngã (~) để quay về thư mục home của user hiện hành, dẫu ngã
kèm theo tên user để chỉ thư mục home của user có tên đó. Dấu chấm (.) để chỉ thư mục hiện hành.
Ví dụ 1: Root đang ở /, dùng cd ~ để quay về /root, dùng cd ~Jackson để về /home/Jackson.
Ví dụ 2: Đang ở thư mục /home/userX/. Hai lệnh cd ./ / / và cd / / là tương đương nhau đều
chuyến sang /. Hai lệnh cd / /home/userX và cd . là tương đương nhau và đều không thay đổi thư
mục hiện hành.
Một điều cực kì quan trọng để giảm công sức gõ lệnh là dùng chức năng autocomplete tên file và thư mục.
Khi gõ tên thư mục hoặc tên file, chỉ gõ 1 hoặc vài chữ cái đầu rồi bấm phím TAB để tự động
Khi gõ tên thư mục hoặc tên file, chỉ gõ 1 hoặc vài chữ cái đầu rồi bấm phím TAB để tự động
điền nốt phần tên còn lại hoặc bấm thêm TAB một lần nữa để hiển thị tất cả những file, thư
điền nốt phần tên còn lại hoặc bấm thêm TAB một lần nữa để hiển thị tất cả những file, thư
mục có cùng các chữ cái đầu như đang gõ. Hãy tập thói quen TAB hoặc TAB TAB.
mục có cùng các chữ cái đầu như đang gõ. Hãy tập thói quen TAB hoặc TAB TAB.
Ví dụ: thay vì gõ cp /boot/vmlinuz-2.6.9-5.EL /backup dài dòng thì hãy gõ cp /boot/vm TAB /backup

Khi bạn gõ một lệnh thì thực chất là bạn gọi file có tên trùng với tên lệnh trong thư mục /bin, /sbin, /usr/bin
hoặc /usr/sbin thế nên nếu không nhớ tên lệnh thì cũng có thể gõ vài chữ cái đầu rồi bấm TAB.
Ví dụ: giả sử định gõ lệnh apropos nhưng lại không nhớ rõ thì chỉ cần gõ ap TAB
Xem nội dung của thư mục: lệnh ls (viết tắt của list), thêm tham số -l (viết tắt của long) để biết đầy đủ
thông tin, tham số -a (viết tắt của all) để hiển thị cả file, thư mục ẩn. (Trong Linux cũng có lệnh dir (viết tắt
của directory) giống trong DOS). Vì file và thư mục trong Linux đều có thể viết hoa và thường nên dấu hiệu
phân biệt file và thư mục khi dùng lệnh ls là màu sắc: thư mục có mầu tím, file có mầu thông thường, một
số loại file đặc biệt khác như link, device, … (nói ở phần sau) có mầu sắc khác. Một số loại file thường với
các định dạng đặc biệt như file tar, gzip hoặc executable file … cũng có màu sắc riêng.
Dưới đây là mô tả thông tin mà lệnh ls –l đưa ra. Giả sử gõ ls –al /mydir
8/18
Quyền
thao tác
với file
Số liên kết
đến file
Chủ
file
Nhóm
chủ file
Kích thước
file (byte)
Ngày giờ
tạo file
Tên file
drwxr-xr-x 2 root root 4096 Oct 12 10:14 thumuc1
Kiểu
file
Trong Linux, các file và thư mục ẩn có tên luôn bắt đầu bằng dấu chấm (.) và chỉ khi có tham số -a trong
lệnh ls mới hiện ra, trên hình vẽ có 1 file ẩn là .config và 2 thư mục ẩn là chấm (.) và chấm chấm ( ). Trong

một thư mục bất kì cũng luôn có hai thư mục ẩn chấm (.) và chấm chấm ( ) tương ứng với thư mục hiện
hành (kí hiệu . ) và thư mục cha (kí hiệu ) khi dùng lệnh cd.
(Kiểu file, quyền thao tác với file, số liên kết với file xem ở phần sau.)
Tên file và thư mục trong Linux có thể chứa mọi kí tự trừ / vì để dành cho kí hiệu root. Tên có thể chứa các
kí tứ đặc biệt (dấu cách và ! @ # $ & ~ % * ( ) [ ] { } ’ " \ : ; > < ‘ ) nhưng trước đó phải thêm dấu \ hoặc tốt
nhất là để tất cả trong dấu ngoặc kép. Ví dụ: cd /My\ File hoặc cd /“My File” để vào thư mục “My File”
dưới /.
Để hiển thị nội dung file dùng lệnh cat tên_file, nhưng với những file text dài người dùng không thể
cuộn lên cuộn xuống từng trang màn hình để xem được. Muốn vậy dùng lệnh less hoặc more. (chú ý tuy
tên gọi như vậy nhưng less ra đời sau và cải tiến hơn more). Với less dùng các phím mũi tên, phím PgUp,
PgDown để xem; với more dùng phím Space bar để tiến, b để lùi. Cuối cùng bấm q để quit.
5 thao tác cơ bản với file và thư mục: tạo mới, đổi tên, di chuyển, copy, xóa
a. Tạo thư mục mới: mkdir <tên_thumuc> (viết tắt của make directory)
b. Tạo một file mới bằng lệnh cat > tên_file, sau đó gõ nội dung file, cuối cùng bấm
CTRL + D để lưu file. Nếu tên_file đã có sẵn thì lệnh cat > tên_file sẽ ghi đè, muốn ghi
tiếp vào cuối file (append) thì dùng lệnh cat >>tên_file. Để tạo một file rỗng dùng lệnh
touch <tên file>. Ví dụ: touch file1 file2 – lệnh này tạo 2 file rỗng tên là file1, file2
cùng lúc.
c. Đổi tên/di chuyển file và thư mục: mv <source> <target>.
i. Ví dụ 1: mv X Y: đổi tên file/thư mục X thành Y
mv X /Y: di chuyển file/thư mục X vào trong thư mục/Y.
ii. Ví dụ 2: mv * di chuyển tất cả file, thư mục trong thư mục hiện thời ra thư mục cha.
d. Copy file và thư mục: cp <source> <target> Nếu copy thư mục không rỗng phải
thêm tham số -r (hoặc – – recursive) thành cp – r
Ví dụ 1: chép toàn bộ file và thư mục con trong thư mục hiện hành vào thư mục /target
(đã có sẵn): cp –r * /target
Ví dụ 2: chép thư mục /source vào thư mục hiện hành: cp –r /source . (chú ý dấu
chấm ở cuối)
e. Xóa file hoặc thư mục rỗng: rm <tên file hoặc thư mục> (ngoài lệnh này Linux
cũng có lệnh rmdir giống DOS để xóa thư mục rỗng). Nếu thư mục không rỗng phải thêm

tham số -r (hoặc recursive). Tuy nhiên người dùng sẽ phải xác nhận việc xóa từng file và
thư mục con, để xóa không cần hỏi dùng thêm tham số -f (hoặc - - force). Tóm lại để xóa
một thư mục một cách nhanh nhất dùng lệnh r m –rf
Ví dụ: rm –rf * xóa tất cả những gì có trong thư mục hiện thời
c. Midnight Commander (mc)
Nếu bạn không có giao diện đồ họa KDE, GNOME … thì việc thao tác với file, thư mục bằng cách gõ lệnh
có thể là một cực hình. Lúc đó hãy dùng phần mềm Midnight Commander (lấy cảm hứng từ phần mềm
Norton Commander kinh điển của thời DOS), nếu Linux đã cài phần mềm này thì chỉ cần gõ lệnh mc. Giao
diện MC, NC có 2 khung cửa sổ vói file, thư mục; các thao tác như cp/mv/mkdir/rm/cat/vi được thực hiện
bằng phím tắt F5/F6/F7/F8/F3/F4 vô cùng tiện lợi và nhiều tính năng khác.
9/18
d. Link
Trong Linux có một kiểu file là link, là một con trỏ trỏ tới một file khác. Có hai loại link là soft link và hard
link: khái niệm softlink giống như shortcut trong windows, hardlink chỉ là một cái tên bí danh cho một file
đã có sẵn. Chi tiết hơn về link cần có kiến thức về Ext2 filesytem mà ở đây không đề cập đến, chỉ nêu ra
những đặc điểm dễ thấy trong thực hành:
Soft link Hard link
Trỏ tới file hoặc thư mục Chỉ trỏ tới file
Có thể nằm ở bất cứ đâu Chỉ nằm trên cùng partition với file gốc
Nếu file, thư mục gốc bị rename, move, delete thì
link sẽ bị hỏng
Nếu file, thư mục gốc bị rename, move, delete thì link
không bị hỏng
Lệnh ln tạo link có tham số -s (soft):
ln –s <tên File> <tên Link>
Lệnh ln tạo link không tham số:
ln <tên File> <tên Link>
Khi ls-l, bên cạnh tên các softlink có dấu mũi tên trỏ đến file gốc, thông tin về hardlink của một file trùng y
nguyên với file gốc.
-rw 1 root root 223 Oct 12 10:14file

lrwxrwxrwx 1 root root 9 Oct 12 10:14softlink  file
-rw 2 root root 223 Oct 12 10:14hardlink
e. Archive và Compress file
Hai thao tác: archive – gộp nhiều file lại thành một file, compress – nén file để có size nhỏ hơn rất được ưa
dùng (Người dùng Windows thường coi thao tác nén hiển nhiên là đã bao hàm thao tác gộp nhiều file).
Trong UNIX/Linux, định dạng file archive phổ biến nhất là .tar (những file .tar còn được gọi là tarball),
định dạng file nén phổ biến nhất là .gz hoặc .bz. Chương trình quen thuộc làm việc với những file này là
tar, gzip, bzip2. Người sử dụng khi download một software nào đó ở dạng source code luôn phải
gặp file kiểu tar và gz.
Khi dùng các lệnh tar, gzip, bzip2, zip như ở dưới đây nếu thành công sẽ không có thông báo gì, do đó nên
thêm tham số -v ( verbose) để hiển thị thêm các thông tin: danh sách các file được (un)tar, tỉ lệ nén, …
tar: gộp/tách nhiều file, thư mục thành một file .tar
tar file: tar –cf <tên file se tar thành> <danh sách các file/thư mục cân tar>
Ví dụ: tar –cvf tarball.tar file1 file2 file3 DIR1 DIR2
xem các file có trong file tar: tar –tf <file.tar>
untar file ra thư mục hiện thời: tar –xf <file.tar>
Tham số -c nghĩa là create, -x nghĩa là extract, t (hoặc list) nghĩa là list, f để chỉ làm việc với file
gzip (GNU zip) nén/giải nén một file thành file .gz
gz file: gzip <tên_file>. Cẩn thận: sau lệnh này file gốc “tên_file” sẽ bị replace bằng file mới có
tên là “tên_file.gz” !
ungzip file: gunzip <file.gz> hoặc gzip –d <file.gz>. (d viết tắt của decompress)
Chú ý: gzip chỉ làm nhiệm vụ nén một file, còn muốn nén nhiều file trước đó phải dùng tar. Các gzipped
tarbal ngoài có đuôi là .tar.gz còn có đuôi là tgz. Trên một số Linux distro có thể đồng thời ungzip và untar
bằng một lệnh: tar –xzf <tên gzipped tarbal>
bzip2 tương tự như gzip với bzip2 để nén, bunzip2 hoặc bzip2 –d để giải nén
zip nén nén nhiều file, thư mục thành một file.
10/18
Định dạng file nén trên các non-*nix OS phổ biến là zip, *nix OS có công cụ zip có chức năng gộp
và nén file zip luôn rất tiện: zip <tên file sẽ zip thành> <danh sách những
file để zip> Để giải nén dùng unzip <file.zip>

f. Tìm kiếm file và thư mục
Để tìm kiếm file hoặc thư mục theo một tiêu chí (criteria) tìm kiếm nào đó sử dụng lệnh
find where-to-search criteria what-to-do
Where-to-search là danh sách các thư mục cần tìm, mỗi thư mục được ngăn cách nhau bởi một dấu cách
Các criteria (tiêu chí tìm kiếm) có thể là -name, -size, -user, -type, -perm, -mtime hoặc -atime
What-to-do là các lệnh thực hiện lên những file, thư mục vừa tìm được, thường bắt đầu bằng –execute, kết
thúc bằng \;
Ví dụ 1: find . tìm tất cả (do không có tiêu chí nào được kể ra) file, thư mục trong thư mục hiện hành (kí
hiệu bằng dấu chấm). Lệnh này thực chất là liệt kê đường dẫn của tất cả các file và thư mục trong thư mục
hiện hành.
Ví dụ 2: find /root ~Jackson –name ‘*doc?’ tìm trong thư mục /root/ và thư mục
/home/Jackson/ những file và thư mục có tên kết thúc bằng “doc” và một kí tự bất kì. Tên có chứa wildcard
được đặt trong 2 dấu ngoặc.
Ví dụ 3: find . ~ -size +100k –type f tìm trong thư mục hiện hành và thư mục dữ liệu của người
đăng nhập các regular file có kích thước hơn 100K.
- Trong Linux, có 7 kiểu file là -, l, d, b, c, p, s (xem mục 6 bài này); ở đây kiểu – (regular file) được
thay bằng f để không lẫn với kí hiệu - trước tham số)
- Đơn vị size là c (byte), k (kilo Byte), M (Mega Byte), G (Giga Byte); dấu + để chỉ lớn hơn, dấu – chỉ
nhỏ hơn, không có dấu nghĩa là bằng.
Ví dụ 4: find . –user Jackson –size -100M –atime -60 tìm trong thư mục hiện hành những file
hoặc thư mục có chủ sở hữu là Jackson, kích thước file nhỏ hơn 100M, được truy cập cách đây không quá
60 ngày. Tham số atime là viết tắt của acess time, đơn vị tính là ngày. Tương tự mtime như ở dưới đây là
modified time
Ví dụ 5: find /home/ /root/ -perm -220, -mtime 3 tìm trong các thư mục của người sử dụng
(root và normal user) các file hoặc thư mục có quyền write với chủ sở hữu và nhóm của chủ sở hữu, được
sửa chữa đúng 3 ngày trước đây.
Sau lệnh tìm kiếm thu được một danh sách (có thể rỗng) các file và thư mục. Để thực hiện lệnh lên từng file,
thư mục trong danh sách này dùng |xargs. Để thực hiện lệnh lên cả danh sách file, thư mục này thì sau lệnh
find thêm –excute, rồi viết lệnh, kết thúc lệnh bằng \;. Danh sách file và thư mục tìm thấy được kí hiệu
bằng { } và ở trong ví dụ 7 được dùng làm tham số cho lệnh rm.

Ví dụ 6: find / -user Jackson | xargs ls –l hiển thị thông tin chi tiết (bằng lệnh ls –l) của tất cả
các file, thư mục của user Jackson
Ví dụ 7: find / -empty -user Jackson –excute rm -rf {} \; tìm và xóa tất cả những file và thư
mục rỗng của user Jackson.
Ví dụ 8: find / -exec -nouser -execute mv {} /tmp \; di chuyển tất cả những executable file
không thuộc quyền sở hữu của ai vào /tmp. (nhớ có đủ \; )
Việc tìm kiếm trên / nhiều khi rất lâu, lệnh locate dưới đây tuy không mạnh bằng find nhưng tốc độ nhanh
hơn hẳn.
Linux có file cơ sở dữ liệu /var/lib/slocate/slocate.db lưu trữ toàn bộ đường dẫn các file và thư mục
của hệ thống, mỗi dòng trong file này chứa một đường dẫn đến file, thư mục nào đó. Có thể tìm kiếm file,
11/18
thư mục theo tên bằng lệnh locate <string> để tìm ra những dòng có chứa đúng xâu <string> trong file
slocate.db trên (string không đặt trong dấu ngoặc nào hết). Để khởi tạo cơ sở dữ liệu này hoặc để cập nhật
nó (vì việc ghi file, thư mục diễn ra thường xuyên) dùng lệnh updatedb.
Ví dụ: Giả sử có file /root/myfile.txt (tạo ra bằng lệnh touch /root/myfile.txt). Sau đó cập nhật slocate.db
bằng updatedb. Giờ tìm đường dẫn cho file này, dùng lệnh locate myfile.txt. Lệnh trên cho cùng kết quả
với locate ot/my, tại sao vậy ?
6. Filesystem Hierarchy standard
/ là thư mục gốc, theo mặc định thì dưới nó là các thư mục sau :
/boot/ chứa file kernel, ramdisk, GRUB bootloader - đây là những file được tải vào RAM đầu tiên.
/dev/ chứa các file device. Khi một device được attach vào máy thì sẽ sinh ra thêm file mới ở thư mục này.
/etc/ chứa các file cấu hình của hệ thống, tất cả đều là plain text.
/proc/ chứa các virtual file, các file này cho biết trạng thái hiện hành (của các process, device, …) của hệ
thống.
/var/ chứa các variable data files.
/bin/, /sbin/, /lib/ chứa các binary files
/bin/: chứa các lệnh cơ bản cho mọi user như pwd, cat, …
/sbin/: chứa các lệnh chỉ của root như fdisk, …
/lib/: thư viện các hàm và kernel modules mà /bin/ và /sbin/ thường gọi đến
/srv/ chứa các file cho các service của hệ thống

/tmp/ các chương trình khi chạy thường lưu các temporay file vào đây
/opt/ chứa các extra software package mà trong lúc cài Linux người dùng đánh dấu thêm vào ngoài default
installation.
/usr/ chứa các chương trình do riêng người sử dụng cài vào, giống Program Files của Windows
/home/, /root/ chứa dữ liệu của người sử dung. Dữ liệu của root nằm trong /root/. Dữ liệu của các normal
user nằm trong /home/. Chẳng hạn có một account tên là student, dữ liệu của student sẽ nằm trong
/home/student. Giống Documents and Settings.
/mnt/, /media/ Hai thư mục này thường (nhưng không nhất thiết) được làm mount point cho các thiết bị.
Nếu là removable device như CD, FDD thường được mount vào dưới /media/, các device khác (như HDD)
thường được mount vào dưới /mnt/
Tất cả các thư mục trên không phải lúc nào cũng được đặt chung dưới partition /. Chẳng hạn /boot/, /opt/,
/usr/ thường được đặt ở các partition riêng rồi được mount vào /.
Trong Linux, trên mỗi partition còn thường có thư mục lost+found để lưu những file hỏng được phát
hiện trong quá trình kiểm tra disk sau mỗi lần hệ thống gặp sự cố.
(Trong mỗi thư mục trên, lại có những thư mục con trong nó, muốn biết chi tiết xem tại
/>12/18
7. Khái niệm file theo nghĩa rộng trong UNIX/Linux
Người sử dụng Windows đã quen với file và thư mục, sang Linux khái niệm “file” được mở rộng hơn, bao
trùm cả file và thư mục đồng thời cả các device, socket, pipe. Thư mục có những đặc điểm giống với file:
- với file có thao tác đọc ghi thì với thư mục cũng có thao tác đọc ghi.
- thư mục cũng có thể coi là một file có nội dung là danh sách các file/thư mục con của nó.
Đến đây bạn đọc đã “tạm chấp nhận” được rằng “thư mục cũng là file”. Qua các bài sau về device, socket,
pipe bạn đọc rồi cũng sẽ thấy những khái niệm này có nét chung với khái niệm file nên có thể khái quát hóa
lên tất cả là file. Người ta thường hay nói “Với *nix mọi thứ đều là file, nếu không là process”.
File (theo nghĩa rộng, nhưng từ đây trở đi ta chỉ nói file không thôi) trong Linux gồm 7 kiểu sau:
Loại file Kí hiệu
Regular file (file theo nghĩa thường)
-
Directory
d

Device file (hay special file): gồm 2 loại
+ Block device
b
+ Character device
c
Link
l
Socket
s
Named pipe
p
Khi dùng lênh ls – l mỗi file sẽ có một dòng mô tả, kí hiệu đầu tiên của dòng này cho biết kí hiệu kiểu file
theo bảng trên. Hãy thử với ls –l /dev/ sẽ thấy toàn bộ các file ở đây có kiểu b hoặc c trong khi dó ls –al /
chỉ có kiểu d hoặc –.
Muốn có thông tin chi tiết hơn về kiểu file dùng lệnh file <tên file> (file theo nghĩa rộng).
Ví dụ hai file /root/.bash_profile và /bin/cat đều là regular file (kí hiệu là – khi dùng lệnh ls –l) nhưng với
lệnh file /root/.bash_profile và file /bin/cat sẽ chỉ rõ một loại là ASCII text, một loại là 32-bit excutable.
13/18
8. Redirection và xargs
a. Redirect stdin, stdout, stderr to file (phần này viết khó hiểu, phải bỏ bớt đi)
Một lệnh khi không được gọi đến nó vẫn chỉ là một executable file nằm im lìm trên HDD. Khi người dùng
gọi đến nó, BASH shell sẽ đưa nó vào RAM để thực thi – lúc này nó trở thành process (tiến trình). Đồng
thời shell cũng kết nối process này với 3 file là /dev/stdin, /dev/stdout, /dev/stderr (viết tắt
của standard input, output, error). Mặc định:
- /dev/stdin gắn với bàn phím của virtual console: mọi kí tự mà người dùng gõ trên bàn phím đều lưu
vào file /dev/stdin.
- /dev/stdout gắn với màn hình của virtual console: mọi kết quả mà process (lệnh) cần in ra màn hình
thì ghi vào file /dev/stdout. File này rồi lại được xuất ra màn hình.
- /dev/stderr gắn với màn hình của virtual console: khi cần thông báo lỗi process (lệnh) sẽ ghi vào
file /dev/stdout. File này rồi lại được xuất ra màn hình.

Ví dụ 1: lệnh xóa file rm myfile.txt.
- Khi chạy, process rm này sẽ tìm file “myfile.txt”, nếu không thấy nó ghi thông báo “myfile.txt
doesn’t exist” ra /dev/stderr, mà stderr được gắn với màn hình nên người dùng nhìn thấy thông báo
trên màn hình. Sau khi ghi xong, stderr được đóng lại, màn hình được “tự do”.
- Nếu tìm thấy file, process này sẽ ghi thông báo
“Really want to delete (y/n) ?” ra /dev/stdout do
stdout được gắn với màn hình nên người dùng cũng
nhìn thấy thông báo trên màn hình. Xong việc stdout
cũng được đóng lại.
- Sau khi nhận được thông báo, người dùng sẽ gõ “y”
hoặc “n” – vì bàn phím gắn với /dev/stdin nên kí tự
này được ghi vào stdin, process sau đó sẽ đọc stdin
để quyết định việc xóa file.
Người sử dụng có thể tự điều chỉnh lại việc gắn stdin,
stdout, stderr vào đối tượng khác, không phải là bàn phím,
màn hình nữa. Việc điều chỉnh này gọi là redirection (điều hướng). Để redirection thêm vào lệnh kí hiệu của
các std này (xem bảng) và kèm thêm địa chỉ file cần gắn vào. File ở đây được hiểu theo nghĩa rộng, có thể là
một regular file trên HDD, một process, một socket nào đó. Ở đây ta chỉ bàn đến redirection đến regular
file.
File Ý nghĩa File descriptor
/dev/stdin Standard input
0< (hoặc <)
/dev/stdout Standard output
1> (hoặc <)
/dev/stderr Standard error
2>
Ví dụ 2: lệnh ls –l.
- Nếu muốn kết quả của lệnh thay vì được in ra màn hình mà in ra file /root/result.txt hoặc nếu có lỗi
thì ghi ra file /roo/error.txt:
o ls –l > /root/result.txt 2> /root/err.txt

o hoặc dạng đầy đủ tương đương: ls –l 1> /root/result.txt 2>/root/err.txt
- Giả sử có file place.txt lưu đường dẫn của một thư mục, để liệt kê file, thư mục con của thư mục
này, bạn đọc có thể nghĩ rằng dùng lệnh ls –l < place.txt nhưng nếu thử bạn đọc sẽ thây kết quả
không như mong đợi. Chỉ có danh sách file, thư mục con của thư mục hiện hành được liệt kê ra mà
không phải của thư mục có đường dẫn được ghi trong file place.txt, mặc dù đã chỉ rõ < place.txt. Lí
do ở đây là lệnh ls không hề làm việc với stdin nên việc redirection lại stdin cũng không ảnh hưởng
đến quá trình thực hiện lệnh. Do đó lệnh ls –l <place.txt tương đương lệnh ls –l.
14/18
rm
myfile
stdoutstderr
stdin
- Nhu cầu trên được giải quyết bằng lệnh xargs chứ không phải bằng redirection: cat place.txt
xargs ls –l . Để tránh nhầm lẫn kiểu này xem thêm xarg ở mục 8.
Nhận xét: rất nhiều lệnh không làm việc với đủ cả 3 stdin, stderr, stdout, lúc đó việc redirection sẽ không có
ý nghĩa gì.
Ví dụ 3: lệnh cat.
- Khi gõ lệnh cat myfile.txt thì:
o Stdin của cat được gắn với myfile.txt, cat đọc dữ liệu từ stdin vào buffer
o Stdout của cat được gắn với màn hình, cat ghi dữ liệu từ buffer vào stdout
- Như vậy bản thân lệnh cat đã không theo mặc định gắn stdin với bàn phím mà gắn stdin với
myfile.txt, thế nên lệnh cat < myfile.txt là tương đương với cat myfile.txt.
- Lệnh cat < source_file > target_file tương đương với cp source_file target_file
- Lệnh cat ngoài việc hiển thị nội dung file có thể redirection lại để được lệnh tạo mới file:
cat > newfile
Người dùng gõ nội dung và bấm CTRL + D để kết thúc.
Ví dụ 4: lệnh rm file1 file2 file3 sẽ 3 lần hỏi người dùng “Really want to delete (y/n) ?”. Nếu tạo ra một file
answer.txt có 3 chứ cái y, n, y mỗi chữ cái nằm trên một dòng
y
n

y
Lệnh sau sẽ tự động trả lời theo file answer.txt: rm file1 file2 file3 <answer.txt và kết quả chỉ có file1, file3
được xóa.
Việc redirect cho stdout, stderr ở trên luôn ghi đè vào file được gắn vào, tức là nếu thực hiện lệnh cat >
myfile hai lần thì nội dung gõ vào của lần sau ghi đè lên lần trước. Để không ghi đè mà ghi tiếp vào phần
cuối (append) của file thì dùng dấu >> thay vì >, cụ thể là dùng 2>>, 1>> (hoặc >>) thay vì 2>, 1>
(hoặc >).
Ví dụ 5: cat >> my_file ghi vào phần cuối file my_file.
Khi muốn cả stdout và stdin cùng gắn vào một file nào đó thì an toàn nhất là dùng lệnh
command 1> file 2>&1 hoặc command 2> file 1>&2 hoặc command &>
file
Ở đây 2>&1 (hoặc 1>&2) hoặc &> có nghĩa là 2> (hoặc 1>) được gắn vào cùng file của 1> (hoặc 2>) tức là
cả 2 std cùng gắn vào một file, nhưng tại một thời điểm chỉ có một std được ghi vào file.
Chú ý tình huống: 1> ghi vào file, sau đó đến lượt 2> ghi vào file và làm mất nội dung của 1>, do đó nên
dùng 1>>&2 (hoặc 2>>&1).
Nếu bạn nghĩ rằng tại sao không dùng lệnh “command 2> file 1> file” để đỡ phải rối mắt với kí hiệu & ?
Suy nghĩ này hợp lý nhưng các shell không chấp nhận cách viết như thế này.
Khi BASH shell thực thi một lệnh nó phân tích lệnh từ trái sang phải, nên cần chú ý thứ tự redirection.
Ví dụ 6: Phân biệt 4 lệnh sau:
command 2>file 2>&1 // kết quả không thay đổi gì: &> màn hình
command 2>&1 1>file // 2>màn hình, 1>file
command 1>file 2>&1 // &>file
command 1>&2 2>file // 1>màn hình, 2>file
Khi không muốn xuất 1> và 2> ra đâu thì hãy xuất vào /dev/null.
15/18
Ví dụ 7: ls –l &> /dev/null thì thông báo lỗi và kết quả sẽ không hiện ra trên màn hình hay ở đâu hết.
b. Pipe và kết hợp với grep, wc, sort, less
Khi muốn cho 1> của process (lệnh) này vào 0> của process (lệnh) khác có thể dùng file trung gian
command_x 1> file
command_y 0< file

nhưng hiệu quả hơn là dùng command_x | command_y (chú ý dấu | ). Công việc này gọi là pipe -
truyền thông liên tiến trình.
Ví dụ: Lệnh ls-l someDir nhiều khi in ra quá 1 trang màn hình. Lệnh less có khả năng hiển thị file với chức
năng cuộn lên cuộn xuống trang màn hình. Kết hợp lại được: ls –l someDir | less rất thuận tiện. Có thể thay
less bằng more, nhưng more thì cũ hơn less.
Pipe thường được kết hợp với grep, wc, sort, less (more), head, tail
grep: Tìm những dòng có chứa một xâu nào đó (thường được cho bởi biểu thức chính qui) trong một file
hoặc một số file. Ví dụ: hiển thị những dòng chứa “root” trong file /etc/shadow: grep ‘root’ /etc/shadow
Ví dụ pipe cho grep: Thư mục /dev/ lưu những device của máy, liệt kê những HDD: ls –l /dev/ | grep hd
wc: đếm số character (c), word (w), line (l) trong file. Ví dụ đếm số dòng trong file wc – l myfile
Ví dụ pipe cho wc: File /etc/passwd lưu các user của hệ thống, mỗi user là một dòng. Đếm số user trong hệ
thống: cat /etc/passwd | wc –l
sort: hiển thị các dòng một file theo thức tự ABC hoặc 123. Ví dụ: sort myfile
Ví dụ pipe cho sort: Liệt kê các file (theo nghĩa rộng) trong thư mục thành từng nhóm. ls –l | sort
head, tail: Hai lệnh này hiển thị 10 dòng đầu/cuối của file, trong trường hợp tổng quát dùng head –n x
hoặc tail –n x <tên file> (x là số dòng). Ví dụ: head –n 20 myfile.
Có thể kết hợp head với tail để hiển thị một dòng có thứ tự bất kì trong file. Ví dụ có file Table lưu bảng dữ
liệu, dòng đầu ghi tiêu đề của các cột, từ dòng thứ 2 trở đi mới ghi các dòng dữ liệu. Hiển thị dòng dữ liệu
đầu tiên của bảng: head –n 2 Table | tail –n 1
Ngoài kết hợp với grep, wc, less, … rất mạnh mẽ; pipe có thể kết hợp với lệnh tee để đưa stdin của một
lệnh vừa ra stdout vừa vào một file. Ví dụ: ls –l | tee list.txt lệnh này vừa liệt kê file, thư mục ra màn
hình vừa ghi kết quả vào file list.txt
c. xargs
Ví dụ về lệnh xargs: Cần xóa một loạt các file, đường dẫn các file này được lưu trong file list.txt, mỗi dòng
một file, dùng lệnh cat list.txt | xargs rm –f
Lệnh xargs: command1 | xargs command2 dùng để đưa stdout của command1 thành đối số của
command2. Nếu stdout của command1 gồm n dòng (n>1) thì sẽ có n lệnh command2 được thực hiện mà
mỗi lệnh có đối số là một dòng của stdout.
Người mới làm quen với pipe thường nghĩ rằng có thể thực hiện yêu cầu trên bằng lệnh:
cat list.txt | rm –f

Nhưng không đúng, vì danh sách các file cần xóa là đối số của lệnh rm, chứ không phải là stdin của lệnh
rm. Lệnh rm chỉ mở stdin khi cần người dùng gõ y hoặc n để xác nhận việc xóa file, stdin của lệnh rm
không gắn với file cần xóa. Cẩn thận nhầm pipe với |xargs.
9. VIM editor
vi hoặc sau này là vim (vi improoved) là chương trình nhỏ soạn thảo file text phổ biến nhất. Gõ lệnh vi
<tên_file> để soạn thảo file mới hoặc sửa file đã có sẵn.
16/18
vi có 3 chế độ (mod) cơ bản:
- command mod: cho người dùng sử dụng các lệnh như undo, copy, paste, … để chỉnh sửa văn bản.
Tại đây gõ i để chuyển sang insert mod, gõ dấu hai chấm (:) để chuyển sang colon mod.
- insert mod (có chữ INSERT ở cuối màn hình) cho người dùng chèn/xóa các kí tự vào văn bản.
- colon mod (có dấu 2 chấm ở cuối màn hình): cho người dùng gõ w để save văn bản hoặc q để quit.
Khi không ở command mod, bấm ESC để quay về command mod.
Ngay sau khi gõ vi <tên file>, người dùng ở chế độ command mod. Hãy bấm i để chuyển sang chế độ insert
mod và sửa chữa văn bản bằng các phím di chuyển và Del, Backspace. Cuối cùng bấm dấu hai chấm (:) để
sang chế độ colon mod, tại đây bấm phím:
- w để lưu (write) văn bản
- wq để lưu rồi quit luôn
- q! (nhớ có !) để quit without saving
Để copy, cut, paste trong vim: tại command mod (bấm ESC) dùng các phím y, d, p nhưng trước đó phải
đánh dấu (bôi đen) đoạn văn bản cần copy, cut. Có 2 cách để bôi đen.
Cách chậm (vẫn tại command mod): Dùng phím l, w để đánh dấu character, word.
Ví dụ 1: để sao chép 3 kí tự bắt đầu từ con trỏ hiện hành, bấm y3w. Chuyển đến nơi cần paste bấm p.
Ví dụ 2: để cut 5 từ (word) bắt đầu từ con trỏ hiện hành, bấm d5w. Chuyển đến nơi cần paste bấm p.
Ví dụ 3: để copy/cut dòng hiện hành bấm yy hoặc dd. Chuyển đến nơi cần paste bấm p. Như vậy việc
copy, cut cả dòng hơi khác với việc copy, cut từng character hoặc word.
Tương tự như l, w người ta dùng phím (, { để đánh dấu từ con trỏ hiện hành đến đầu dòng, đoạn văn bản và
), } để đến cuối dòng, đoạn văn bản. Người viết tài liệu này cũng chỉ dùng yy, dd thôi chứ dùng đến l, w, (,
{, ), } thì mệt quá !
Cách nhanh: chuyển sang visual mode. Ngoài 3 chế độ command, insert, colon ở trên vim còn có thể

có thêm visual mod nếu lúc cài đặt vim chức năng này được chọn. Tại command mod (bấm ESC), bấm v để
sang visual mod (nếu có). Tại đây chỉ cần di chuyển con trỏ là hộp sáng sẽ bôi đen văn bản theo. Sau khi bôi
đen xong bấm y hoặc d để copy, rồi di chuyển đến nơi cần paste bấm p.
Trong quá trình soạn thảo nếu muốn undo lại thao tác trước đó thì chuyển về command mod (bấm ESC)
và bấm u (undo).
Có thể tìm kiếm trong vim bằng cách chuyển về colon mod, gõ /<xâu> (chú ý dấu /) để tô sáng tất cả các
xâu trong văn bản. Xâu ở đây có thể được cho bởi biểu thức chính qui  xem thêm mục 10.
Ngoài vim ra còn nhiều editor khác phổ biến không kém, chả hạn nano và emacs. Thử xem.
10. Regular expression
Regular expression còn thường được viết tắt thành regex (biểu thức chính qui) là một qui luật cho một loạt
xâu kí tự. Ví dụ biểu thức chính qui ab* đại diện cho các xâu kí tự a, abb, abbb….
Khái niệm Regex và Metacharacters (xem ở mục 3) là hai khái niệm rất dễ bị nhầm lẫn bởi regex và
metacharacter cùng sử dụng những kí tự đặc biệt như *, {}, \ nhưng cách sử dụng chúng thì khác hẳn
nhau. Regex được dùng khi xử lí text nhất là khi tìm kiếm xâu trong file text; Metacharacters được dùng khi
viết lệnh Shell. Hơn nữa ngữ nghĩa của 2 loại này cũng khác nhau: ở ví dụ trên ta có regex ab*, với
metacharacters ta cũng có ví dụ ab* nhưng nó đại diện cho ab, abx, aby, abxyzt… tức là chứa cả những xâu
mà regex ab* không đại diện cho. Cần phân biệt wildcard *, ? được dùng khi viết lệnh về tên file, thư mục
còn *, ? trong regex được dùng khi xử lí xâu; ý nghĩa trong 2 trường hợp là khác hẳn nhau.
Regex được dùng khi cần tìm kiếm xâu trong:
17/18
1. Chế độ search của vim editor, less, more, man: Cả 3 lệnh vi, less, more đều có colon mod – chế độ
dấu hai chấm. Tại đây gõ / và một regex để tô sáng những xâu thỏa regex.
2. Lệnh tìm kiếm grep: hiển thị những dòng trong một hoặc một số file text thỏa mãn một regex nào đó
Ý nghĩa của regex:
Kí tự trong regex Xâu thỏa mãn
a (hoặc một kí tự bất kì) Xâu chứa kí tự a
\<abc Xâu bắt đầu bằng ‘abc’
abc>\ Xâu kết thúc bằng ‘abc’
^ Xâu nằm ở đầu dòng
$ Xâu nằm cuối dòng

[range] ví dụ [cy] Xâu chứa kí tự nằm trong miền [range] ví dụ từ ‘c’ đến ‘y’
\[ hoặc \] Xâu chứa kí tự [ hoặc ]
[^c] Xâu không chứa kí tự c
“ab*” Xâu chứa a, ab, abb, abbb, abbbb, …
“.” Một kí tự bất kì
eregex (extend regex) còn chứa thêm kí tự đặc biệt: |, +, ?
Kí tự trong eregex Xâu thỏa mãn
“A1|A2|A3” Xâu chứa “A1” hoặc “A2” hoặc “A3”
“cat+” Xâu chứa ít nhất “cat” và các kí tự khác theo sau bất kì. Ví dụ:
cat, catx, catmn, catabc, …
“abx?” Xâu chứa “ab” hoặc “abx”
Ví dụ 1: grep ‘^host’ file.txt hiển thị những dòng bắt đầu bằng host trong file.txt
Ví dụ 2: grep –v “^$” file.txt hiển thị tất cả các dòng trừ dòng trống trong file.txt. Tham số -v với nghĩa trừ
ra những dòng thỏa mãn regex.
Một thói quen của lập trình viên là xâu luôn được để trong dấu ngoặc kép nhưng như bảng trên cho thấy chỉ
khi xâu đó chứa kí tự đặc biệt như là *, +, ?, |, . thì mới phải dùng dấu ngoặc kép.
Ví dụ 3: để tìm xâu Peter Thompson trong một đoạn text, chỉ cần gõ /Peter Thompson là đủ, không cần
phải gõ /“Peter Thompson” (dấu cách ở đây vẫn được tính là kí tự thường). Nhưng để tìm các xâu có dạng
Google hoặc Gooogle, Goooogle, Gooooogle, Goooooogle, Gooooooogle, … thì phải gõ /“Goo*gle”
18/18

×