Làm quen với xargs Image Làm quen với xargs

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ư grepawk 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ư cpecho 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.