Saya punya sesuatu seperti ini:
% ls -1dF /tmp/foo/*
/tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/
/tmp/foo/002e34c2218f2c86fefd2876f0e5c2559c5fb3c4/
/tmp/foo/00b483576791bab751e6cb7ee0a7143af43a8069/
.
.
.
/tmp/foo/fedd0f7b545e7ae9600142656756456bc16874d3/
/tmp/foo/ff51ac87609012137cfcb02f36624f81cdc10788/
/tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/
Saya ingin membuat direktori di bar
bawah setiap subdirektori di bawah foo
.
Jika saya mencoba melakukan ini dengan
% mkdir -p /tmp/foo/*/bar
... Saya mendapatkan kesalahan
zsh: no matches found: /tmp/foo/*/bar
(Kalau dipikir-pikir, saya bisa mengerti alasan kesalahan itu.)
Saya tahu bahwa saya dapat memecahkan masalah asli dengan for-loop, tapi saya ingin tahu apakah zsh
mendukung beberapa bentuk ekspansi parameter yang akan menghasilkan argumen yang diinginkan untuk satu permintaan mkdir -p
. TKI, ekspansi parameter setara dengan "tambahkan /bar
ke setiap awalan yang dihasilkan oleh ekspansi /tmp/foo/*
", menghasilkan
% mkdir -p /tmp/foo/000f9e956feab3ee4625aebb65ae7bae9533cdbc/bar ... /tmp/foo/ff8b983a7411395344cad64182cb17e7cdefa55e/bar
mkdir -p
, yang akan memiliki efek yang sedikit berbeda dari perintah Anda untuk tidak melakukan kesalahan jika beberapa direktori tersebut sudah memilikibar
subdirektori. Poin kecil tapi perlu diperhatikan di sini. :)${^spec}
dan menambahkanbar
ke setiap elemen dari apa pun yang/tmp/foo/*(/)
meluas ke:set -- /tmp/foo/*(/)
thenmkdir -p -- "${^@}/bar"
Tentu - gunakan satu lingkaran
gumpalan digunakan untuk memperluas daftar item yang ada , bukan hal-hal yang belum dibuat.
sumber
zsh
dapat memperluas gumpalan dan menambahkan teks dengan sintaks tunggal — tapi saya pikir itu kemungkinan satu-satunya cara untuk melakukan apa yang Anda inginkan, @kjo.Jika direktori berada dalam array, Anda dapat menggunakan
${^...}
bentuk ekspansi.sumber
Anda dapat menggunakan
find
danxargs
melakukannya:yang menggunakan
-maxdepth 1
dan-mindepth 1
untuk mencegah pembuatanbar
dalam subdirektori target, dan/tmp/foo
masing-masing dengan sendirinya.type d
membuatnya hanya mempertimbangkan direktori.Anda harus menghapus
echo
untuk melakukan tindakan yang sebenarnya, jika tidakecho
hanya akan mencetak baris untuk dieksekusi. Anda juga dapat melampirkannya di subtitusi suka$()
mengeksekusi.Manual mengatakan
xargs -i
sudah usang, tetapi saya tidak menemukan alternatif lain yang sama praktisnya, sehingga masih bisa digunakan selama beberapa tahun ... Anda dapat menggantinya-i
dengan yang-I'{}'
terbaru.sumber
@loa_in_ memiliki sebagian besar, tetapi
find
output perpipaan cenderung palsu.sumber
xargs
dengan alat yang berbeda yang tidak memiliki-exec
alternatif, jadi saya menggunakan pendekatan saya karena bekerja dengan semuanya secara merata.