Saya ingin membuat banyak direktori menggunakan mkdir
. Setiap nama direktori akan terdiri dari awalan (string) dan indeks (integer). Misalkan saya ingin awalan menjadi "s" dan indeks berkisar dari 1 hingga 50. Ini berarti bahwa saya ingin membuat direktori berjudul:
s1
,, s2
... s49
,,s50
Apakah ada cara untuk melakukan ini secara otomatis menggunakan mkdir
? Terima kasih atas waktunya.
bash
. Terima kasih atas waktu Anda!s01
,s02
, ...,s49
,s50
. Jika saya menggunakan indeks lebar tetap,/bin/ls
hampir selalu menghasilkan pesanan yang saya inginkan.Jawaban:
Anda dapat melakukan ini dengan skrip shell.
Pure sh - ini akan bekerja bahkan pada shell bourne pra-POSIX:
Jika Anda ingin membuat banyak direktori, Anda dapat membuat skrip lebih cepat dengan menguranginya menjadi satu panggilan
mkdir
sekaligus menggunakan shell bawaan untuk pengujian dan aritmatika. Seperti ini:Zsh, ksh93 atau bash membuat ini lebih mudah, tapi saya harus menunjukkan ini tidak dibangun ke dalam
mkdir
dan mungkin tidak berfungsi di shell lain. Untuk kasus yang lebih besar, ini juga dapat dipengaruhi oleh batasan jumlah atau ukuran total argumen yang dapat diteruskan ke perintah.sumber
n=$(( n + 1 ))
akan sama kerasnya dengan POSIX dan tidak akan dikenakan biaya sedikitpun.[[
kata kuncinya bukan POSIX. (Belum lagi itu[
adalah shell builtin di banyak shell modern.)[[
bekerja pada sayaksh88
(yang mendahuluibash
) jadi saya berasumsi itu POSIX. Saya tidak dapat menemukan menyebutkannya dalam spesifikasi POSIX jadi saya yakin Anda benar. Terimakasih atas infonya!for i in {range}
bagi pengguna shell canggih.Satu
Dua
Opsi ini berfungsi di bash , zsh dan ksh93
Tiga
sumber
$i
dari sekedar membuat direktori misalnyamkdir s$i ; echo $i > s$i/$i
. Juga, One adalah contoh sederhana yang bagus untuk menggunakan for for in bash ... di situs seperti ini sama sekali tidak mungkin bagi pengguna pemula untuk melihatnya dan berpikir "bagus, saya tidak sadar Anda bisa melakukan itu "---> pencerahan.Banyak jawaban rumit di sini, tetapi bash membuatnya sangat mudah. Tentu, solusi POSIX murni berfungsi, tetapi mengapa tidak mengambil keuntungan dari
bash
shell yang Anda gunakan, bagaimanapun? Anda dapat melakukan ini dengan mudah dengan ekspansi brace :sumber
mkdir $(seq --format 's%.0f' 1 50)
atau jika Anda menginginkan angka nol-empuk (yang akan lebih baik untuk menyortir):
mkdir $(seq --format 's%02.0f' 1 50)
atau:
mkdir s$(seq -s ' s' -w 1 50)
- perhatikan string 's' tepat sebelum$()
, tanpa itu direktori pertama yang dibuat hanya '01' daripada 's01'dan akhirnya:
mkdir $(printf "s%02i " $(seq 1 50))
seq
berasal dari GNU Coreutilsanehnya, seq's
--format
atau-f
opsi hanya memungkinkan tipe ganda floating point printf (seperti f dan g. juga format hex floating point aneh yang saya tidak pernah menemukan gunanya). Saya tidak tahu kenapa. Akan lebih baik jika juga mendukungprintf(3)
tipe numerik lainnya seperti integer (d, i), oktal (o, U) atau hex (x, X).Bagaimanapun, format ganda dengan 0 desimal presisi suka
%.0f
atau%02.0f
cukup dekat dengan integer untuk tujuan ini.Lihat juga: http://www.gnu.org/software/coreutils/manual/html_node/seq-invocation.html
sumber
{1,50}
atau{01,50}
(untuk zero-padding) jauh lebih mudah dan lebih mudah dimengerti.Untuk menjadi berbeda, inilah solusi sh POSIX yang menggunakan rekursi:
sumber