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 xargs
perintah untuk membaca dalam daftar file untuk membuat direktori menggunakan mkdir
.
xargs
mampu mereferensikan a placeholder
( {}
) dengan -I
flag, 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
xargs
juga mampu menjalankan perintah shell sewenang-wenang dengan sh -c
bendera:
foo.txt bar.txt | xargs sh -c 'echo arbitrary command!'
Menggabungkan Konsep:
Kita bisa menggabungkan konsep-konsep ini dengan mkdir -p
bukannya mkdir
dan 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 -p
dan kemudian touch
nama file di direktori masing-masing.
Berikut ini rincian dari apa yang terjadi pada perintah di atas:
Katakan misalnya files.txt
penampilan 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 {}
, xargs
akan 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
f
variabel secara keseluruhan ketika kita touch
:
touch deeply/nested/foo/bar.txt
touch deeply/nested/baz/fiz.txt