Bài viết này giới thiệu với các bạn cách làm quen với xargs trên hệ điều hành Linux giúp các bạn có thể tự học Linux dễ dàng.
1. Giới thiệu về xargs
xargs là một lệnh có thể được sử dụng để xây dựng và thực thi các lệnh từ đầu vào tiêu chuẩn. Một số lệnh như grep
và awk
có thể chấp nhận đầu vào làm đối số hoặc từ đầu vào tiêu chuẩn. Tuy nhiên, những lệnh khác như cp
và echo
chỉ có thể lấy đầu vào làm đối số. Đó là lý do tại sao xargs
là cần thiết.
Theo mặc định lệnh xargs
đọc các mục từ đầu vào được phân tách bằng khoảng trắng và thực thi lệnh một lần cho mỗi đối số.
Trong ví dụ sau, đầu vào dùng lệnh echo
nhập vào 3 đối số file1 file2 file3 các đối số cách nhau dấu space dẫn đến xargs
và lệnh mkdir
được chạy cho mỗi đối số, tạo ba thư mục.
[root@test1 test]# echo "file1 file2 file 3" | xargs mkdir
[root@test1 test]# ls -l
total 0
drwxr-xr-x 2 root root 6 Apr 16 22:17 file1
drwxr-xr-x 2 root root 6 Apr 16 22:17 file2
drwxr-xr-x 2 root root 6 Apr 16 22:17 file3
2. Ứng dụng lệnh xargs
2.1. Sử dụng xargs với lệnh khác
Lệnh echo
là mặc định thực thi của lệnh xargs
, nhưng chúng ta có thể chỉ định bất kỳ lệnh nào khác kết hợp với xargs
.
Ví dụ 1: Kết hợp lệnh xargs
với lệnh ls
lệnh này yêu cầu chúng ta nhập một tệp hoặc tên thư mục. Thực hiện như bên dưới
[root@test1 ~]# xargs ls -l
/etc
total 1076
drwxr-xr-x 4 root root 35 May 29 2018 acpi
-rw-r--r--. 1 root root 16 May 29 2018 adjtime
-rw-r--r-- 1 root root 1518 Jun 7 2013 aliases
-rw-r--r--. 1 root root 12288 Mar 22 22:29 aliases.db
drwxr-xr-x. 2 root root 4096 Mar 29 11:16 alternatives
-rw------- 1 root root 541 Nov 20 21:22 anacrontab
-rw-r--r-- 1 root root 55 Oct 30 21:50 asound.conf
-rw-r--r-- 1 root root 1 Oct 31 00:10 at.deny
...
Khi nhập /etc
chúng ta sử dụng tổ hợp phím Ctrl+D để lệnh xargs
chuyển thông tin đó cho lệnh ls
. Trong ví dụ trên lệnh xargs
đã thực thi lệnh ls
với tên thư mục làm đối số dòng lệnh để tạo danh sách các tệp có trong thư mục đó.
Ví dụ 2: Chúng ta có thể sử dụng lệnh find
cùng với tùy chọn -name
của nó kết hợp với lệnh xargs
tìm các file có đuôi .txt trong thư mục hiện tại. Thực hiện như sau:
[root@test1 ~]# xargs find -name
"*.txt"./scapy/.travis/codespell_ignore.txt
./name.txt
./name2.txt
./name3.txt
./name4.txt
Ví dụ trên chúng ta đã cung cấp "* .txt" trong đầu vào thông qua stdin chúng ta cần bấm Ctrl + D để lệnh xargs
chuyển thông tin đó cho lệnh find
tìm kiếm tất cả các tệp .txt trong thư mục hiện tại.
2.2.Cách tạo xargs thực thi lệnh nhiều lần
Ví dụ 1: Chúng ta muốn là lệnh xargs
truyền *.d
trong đầu vào chúng ta cần bấm Ctrl + D để lệnh xargs
chuyển thông tin đó lệnh find
, do đó find sẽ cho chúng ta kết quả liên quan đến các tệp .d, sau đó *.log
được truyền và tiếp theo là *.d
được truyền vào lệnh find. Chúng ta có thể thực hiện bằng cách sử dụng tùy chọn -L
. Chúng ta thực hiện như sau:
[root@test1 ~]# xargs -L 1 find -name
"*.d"
./backup/abc.d
./backup/xyz.d
"*.log"
./data/test1.log
./data/test2.log
./data/test3.log
./data/test4.log
./data/test5.log
"*.txt"
./scapy/.travis/codespell_ignore.txt
./name.txt
./name2.txt
./name3.txt
./name4.txt
Ví dụ 2: Trong trường họp chúng ta muốn truyền *.txt
*.log
*.d
trên một dòng sau khi nhập đầu vào chúng ta cần bấm Ctrl + D để lệnh xargs
chuyển thông tin đó cho lệnh find
. Chúng ta có thể sử dụng tùy chọn -n
để truyền đầu vao trên một dòng. Như ví dụ bên dưới:
[root@test1 ~]# xargs -n 1 find -name
"*.txt" "*.log" "*.d"
./scapy/.travis/codespell_ignore.txt
./name.txt
./name2.txt
./name3.txt
./name4.txt
./data/test1.log
./data/test2.log
./data/test3.log
./data/test4.log
./data/test5.log
./backup/abc.d
./backup/xyz.d
Ví dụ 4: Tìm ra tất cả các hình ảnh .png và lưu trữ chúng vào file nén .tar.gz bằng cách sử dụng tar như sau.
[root@test1 ~]# cd Pictures/
[root@test1 Pictures]# ls -l
total 368
-rw-r--r-- 1 root root 86271 Apr 13 15:46 1.jpg
-rw-r--r-- 1 root root 7616 Apr 13 15:46 2.jpg
-rw-r--r-- 1 root root 36287 Apr 13 15:46 3.jpg
-rw-r--r-- 1 root root 238015 Apr 13 15:46 4.jpg
[root@test1 Pictures]# cd
[root@test1 ~]# find Pictures/ -name "*.jpg" -type f -print0 | xargs -0 tar -cvzf images.tar.gz
Pictures/1.jpg
Pictures/2.jpg
Pictures/3.jpg
Pictures/4.jpg
[root@test1 ~]# ls -l images.tar.gz
-rw-r--r-- 1 root root 359950 Apr 13 15:47 images.tar.gz
Trong đó tùy chọn -print0
cho phép in đường dẫn tệp đầy đủ trên đầu ra.
Ví dụ 5: Sử dụng xargs
để sao chép một tệp vào nhiều thư mục cùng một lúc thực hiện như sau:
root@test1 ~]# echo ./DATA ./WEB | xargs -n 1 cp -v data/sql/SQL/Chap\ 01.pdf
‘data/sql/SQL/Chap 01.pdf’ -> ‘./DATA’
‘data/sql/SQL/Chap 01.pdf’ -> ‘./WEB’
Ví dụ 6: Lệnh xarags cũng cho phép tìm và xóa đệ quy một thư mục, ví dụ lệnh sau sẽ loại bỏ đệ quy sql trong thư mục data.
[root@test1 ~]# find data -name "sql" -type d -print0 | xargs -0 /bin/rm -v -rf "{}"
removed ‘data/sql/SQL/Chap 01.pdf’
removed ‘data/sql/SQL/Chap 03.pdf’
removed ‘data/sql/SQL/Chap 02.pdf’
removed ‘data/sql/SQL/Chap 06.pdf’
removed ‘data/sql/SQL/.DS_Store’
removed ‘data/sql/SQL/Chap 05.pdf’
removed ‘data/sql/SQL/Chap 04.pdf’
removed ‘data/sql/SQL/Bai Tap Thuc Hanh CSDL - Huflit_2016.pdf’
removed ‘data/sql/SQL/CSDL_B1.txt’
removed ‘data/sql/SQL/Chap 0.pdf’
removed directory: ‘data/sql/SQL’
removed directory: ‘data/sql’
2.3. Cách tìm tệp chứa văn bản cụ thể
Lệnh xargs
rất hữu ích nếu bạn muốn tìm kiếm các tệp chứa một văn bản cụ thể.
Ví dụ: Tìm các tệp *.txt
chứa văn bản "Hello", chúng ta thực hiện theo cách sau:
[root@test1 ~]# find -name "*.txt" | xargs grep "Hello"
./name.txt:Hello
./name2.txt:Hello
./name3.txt:Hello
./name4.txt:Hello
2.4. Lệnh xargs sử dụng đầu vào từ một tệp
Tùy chọn -a
cho phép cuúng ta sử dụng đầu vào từ một tệp.
Ví dụ: Tệp có tên input.txt. Nó chứa đầu vào cho lệnh xargs
chuyển thông tin đó cho lệnh ls
. Thực hiện như sau:
[root@test1 ~]# cat input.txt
name.txt
name2.txt
name3.txt
[root@test1 ~]# xargs -a input.txt ls -l
-rw-r--r-- 1 root root 6 Apr 10 20:15 name2.txt
-rw-r--r-- 1 root root 6 Apr 10 20:15 name3.txt
-rw-r--r-- 1 root root 6 Apr 10 20:15 name.txt
2.5. Giới hạn đầu ra trên mỗi dòng
Chúng ta có thể sử dụng tùy chọn -n
để giới hạn đầu ra trên mỗi dòng
Lệnh xargs
hiển thị tất cả đầu vào.
[root@test1 ~]# echo b l o g d . n e t | xargs
b l o g d . n e t
Nhưng chúng ta có thể tạo đầu ra của lệnh xargs
được chia thành nhiều dòng bằng tùy chọn -n
.
Ví dụ: Chúng ta sử dụng -n 3
, sẽ chỉ hiển thị 3 mục trên mỗi dòng trong đầu ra xargs
.
[root@test1 ~]# echo b l o g d . n e t | xargs -n 3
b l o
g d .
n e t
2.6 Nhắc người dùng trước khi thực hiện
Sử dụng tùy chọn -p, bạn có thể xác nhận việc thực hiện lệnh xargs
từ người dùng.
Ví dụ 1: trước, nếu chúng ta muốn xác nhận mỗi lần thực hiện lệnh /bin/echo của người dùng, hãy sử dụng tùy chọn -p
cùng với tùy chọn -n
như bên dưới:
[root@test1 ~]# echo b l o g d . n e t | xargs -p -n 3
echo b l o ?...y
b l o
echo g d . ?...y
g d .
echo n e t ?...y
n e t
Ví dụ 2: Hiển thị giới hạn hệ thống trên xargs
bằng tùy chọn --show-limits
[root@test1 ~]# xargs --show-limits
Your environment variables take up 2196 bytes
POSIX upper limit on argument length (this system): 2092908
POSIX smallest allowable upper limit on argument length (all systems): 4096
Maximum length of command we could actually use: 2090712
Size of command buffer we are actually using: 131072
Execution of xargs will continue now, and it will try to read its input and run commands; if this is not what you wanted to happen, please type the end-of-file keystroke.
Warning: echo will be run at least once. If you do not want that to happen, then press the interrupt keystroke.
5. Lời kết
Qua bài trên, cho chúng ta biết cách sử dụng lệnh xargs
và cách kết hợp lệnh xargs
với bất kỳ lệnh nào trên hệ điều hành Linux.