Linux CLI: xargs

Pernah ngga, lagi login ssh ke server, akses hanya CLI ga ada X, terus kita mau set banyak file dan folder permission ?

Untuk lebih jelasnya skenarionya begini:

anda punya folder yang isinya file-file *.php dan *.txt
semua file dan folder tersebut punya permission 777 (bisa dibaca dan ditulis oleh siapapun)
lalu anda mau set semua file .php, hanya .php saja punya permission 644 (file bisa dibaca oleh siapapun tapi hanya bisa ditulis oleh owner-nya)
sedangkan file-file .txt akan di set permission 666 (bisa dibaca tulis oleh siapapun, tetapi tidak bisa dieksekusi atau di-run)
dan folder-folder akan di-set 755 (folder bisa diakses oleh siapapun tetapi hanya bisa ditulis oleh owner-nya)
PIkirkan tentang banyak file dalam sub-folder, banyaknya itu sekitar.. mmh 200 file 10 sub-folder deh misalnya, cukup banyak kan tuh, saking banyaknya sampe ga efektif lagi kalo jalanin command satu per satu.

Harus sekaligus, 1 line command-line di Linux dan beres masalah anda itu.

Seneng banget deh gw pake linux, yang seperti diatas itu jadi pekerjaan kecil

Sodara-sodara, eng ing eng, perkenalkan….. xargs

Mari kita membuat bahan untuk berlatih:

$
$ mkdir -p test test/folder1 test/folder2
$
$ touch test/s1.php test/s2.php test/d1.txt test/d2.txt
$ touch test/folder1/yyy.php test/folder1/zzz.php
$ touch test/folder1/yyy.txt test/folder1/zzz.txt
$ touch test/folder2/yyy.php test/folder2/zzz.php
$ touch test/folder2/yyy.txt test/folder2/zzz.txt
$
$ ls test
d1.txt d2.txt folder1 folder2 s1.php s2.php
$
$ find test/*
test/d1.txt
test/d2.txt
test/folder1
test/folder1/yyy.txt
test/folder1/zzz.php
test/folder1/yyy.php
test/folder1/zzz.txt
test/folder2
test/folder2/yyy.txt
test/folder2/zzz.php
test/folder2/yyy.php
test/folder2/zzz.txt
test/s1.php
test/s2.php

Setelah membuat file-file dan folder-folder, sekarang kita set semua file dan folder mempunyai permission 777.

$ chmod 777 -R test

Bahan latihan sudah siap, tinggal eksekusi:

Listing semua file dalam folder test

$ find test/* -type f
test/d1.txt
test/d2.txt
test/folder1
test/folder1/yyy.txt
test/folder1/zzz.php
test/folder1/yyy.php
test/folder1/zzz.txt
test/folder2
test/folder2/yyy.txt
test/folder2/zzz.php
test/folder2/yyy.php
test/folder2/zzz.txt
test/s1.php
test/s2.php

Kalo anda perhatikan, rupanya command find test/* -type f akan menampilkan semua file dalam folder percobaan kita ini, folder test. Sekarang kita persempit hanya menampilkan file-file yang .php:

$ find test/* -type f | grep .php
test/folder1/zzz.php
test/folder1/yyy.php
test/folder2/zzz.php
test/folder2/yyy.php
test/s1.php
test/s2.php

Yup, piping ke grep .php pada hasil find test/* -type f akan mempersempit pencarian kita. Piping ke grep .txt akan menghasilkan pencarian hanya pada file-file dengan ekstensi txt saja dan find test/* -type d tanpa perlu piping kemanapun akan menghasilkan pencarian hanya sub-folder saja.

Sekarang mari kita set semua file .php ke permission 644 (defaultnya 777, diatas):

$ find test/* -type f | grep .php | xargs chmod 644

Lalu kita set semua file .txt ke permission 666:

$ find test/* -type f | grep .txt | xargs chmod 666

Dan terakhir, kita set semua sub-folder ke permission 755:

$ find test/* -type d | xargs chmod 755

Perintah sederhana tapi powerfull ini, xargs, menerima masukan dari find dan memproses masukan satu per satu dengan menjalankan perintah yang diinginkan (chmod xxx).

Hal yang sama anda bisa terapkan apabila anda ingin merubah (convert) semua file *.3gp pada folder spesial anda ke *.avi, contoh:

$ ls *.3gp
bandung.3gp jkt.3gp medan.3gp

Gunakan ls untuk menampilkan semua file berekstensi 3gp dan pipe ke xargs yang akan menjalankan konversi dari 3gp ke avi:

$ ls *.3gp | cut -d . -f 1 | xargs -I POLA_NAMA ffmpeg -i POLA_NAMA.3gp -f avi -vcodec xvid -acodec mp3 -ar 22050 POLA_NAMA.avi

Hasilnya:

$ ls *.3gp
bandung.3gp bandung.avi jkt.3gp jkt.avi medan.3gp medan.avi

Simak penjelasannya berikut ini:

$ ls *.3gp
bandung.3gp jkt.3gp medan.3gp
$ ls *.3gp | cut -d . -f 1
bandung
jkt
medan

Yeah, neat eh pipe ls *.3gp ke cut -d . -f 1 akan memotong ekstensi file. Kata “bandung.3gp” akan dipecah menjadi 2 field yaitu “bandung” dan “3gp”. Parameter -d . artinya cut dengan delimeter . (dot) dan -f 1 yang artinya setelah dipisahkan oleh delimeter maka yang diambil adalah field pertama, “bandung”.

Setelah mendapatkan nama-nama file nya tanpa ekstensi, kita pipe pada xargs -I POLA_NAMA ffmpeg -i POLA_NAMA.3gp -f avi -vcodec xvid -acodec mp3 -ar 22050 POLA_NAMA.avi.

xargs -I POLA_NAMA bermaksud mendefinisikan bahwa seluruh POLA_NAMA akan dirubah menjadi apapun itu yang di-pipe pada xargs.

Selamat mencoba !

==========================

Posting ini 100% repost dari sini

Monggo dinikmati😀

==========================

 

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s

%d bloggers like this: