Dimungkinkan untuk "berpura-pura".
Pertama, beberapa teori yang dibutuhkan:
Rob Griffiths memposting sebuah artikel pada tahun 2007 berjudul Mudah Membuat Banyak Folder Baru di Macworld.com di mana ia berdiskusi menggunakan xargsperintah untuk membaca dalam daftar file untuk membuat direktori menggunakan mkdir.
xargsmampu mereferensikan a placeholder( {}) dengan -Iflag, yang berisi nilai untuk setiap argumen yang diteruskan xargs. Inilah perbedaan antara dengan bendera itu, dan tanpa:
$ foo.txt bar.txt | xargs echo
$ => foo.txt bar.txt
$ foo.txt bar.txt | xargs -I {} echo {}
$ => foo.txt
$ => bar.txt
xargsjuga mampu menjalankan perintah shell sewenang-wenang dengan sh -cbendera:
foo.txt bar.txt | xargs sh -c 'echo arbitrary command!'
Menggabungkan Konsep:
Kita bisa menggabungkan konsep-konsep ini dengan mkdir -pbukannya mkdirdan konsep di @ldx 's jawaban untuk menghasilkan ini:
$ cat files.txt | xargs -I {} sh -c 'f="{}" && mkdir -p -- "${f%/*}" && touch -- "$f"'
Perintah ini pada dasarnya memetakan setiap nama file dalam daftar file yang dipisahkan baris, memotong bagian file, membuat direktori dengan mkdir -pdan kemudian touchnama file di direktori masing-masing.
Berikut ini rincian dari apa yang terjadi pada perintah di atas:
Katakan misalnya files.txtpenampilan saya seperti ini:
deeply/nested/foo/bar.txt
deeply/nested/baz/fiz.txt
cat files.txt menghasilkan deeply/nested/foo/bar.js deeply/nested/baz/fiz.txt
deeply/nested/foo/bar.js deeply/nested/baz/fiz.txt disalurkan ke xargs
- karena kita menggunakan
-I {}, xargsakan menerjemahkan setiap argumen ke perintah itu sendiri, jadi sekarang kita memiliki:
deeply/nested/foo/bar.txt
deeply/nested/baz/fiz.txt
- kami kemudian menjalankan perintah shell yang menggunakan
&&combinator untuk mengelompokkan 3 perintah yang berjalan secara berurutan - perintah pertama menyimpan file dalam variabel lingkungan (yang akan digunakan kembali pada file berikutnya) menggunakan placeholder yang telah kami daftarkan sebelumnya, jadi kami sekarang memiliki:
f=deeply/nested/foo/bar.txt
f=deeply/nested/baz/fiz.txt
- kita sekarang memiliki variabel yang bisa kita lewati
mkdir -p, tetapi kita perlu memotong nama file. Cukup sederhana menggunakan '${f%/*}':
mkdir -p deeply/nested/foo/
mkdir -p deeply/nested/baz/
- dan kemudian kita hanya mereferensikan
fvariabel secara keseluruhan ketika kita touch:
touch deeply/nested/foo/bar.txt
touch deeply/nested/baz/fiz.txt