Sabtu, 21 Januari 2012

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 padaxargs -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_NAMAakan dirubah menjadi apapun itu yang di-pipe pada xargs.
Selamat mencoba !

Tidak ada komentar:

Posting Komentar