Saya memiliki kode berikut yang membuat array dan beralih ke direktori dan membuat subdirektori di bawah setiap elemen array.

#!/bin/bash
cd /var/www
dirs=$(find * -maxdepth 0 -type d)

for dir in "${dirs[@]}"; do
        echo $dir
        mkdir $dir/backups
done

Sementara itu menggemakan semua direktori, itu membuat direktori hanya pada elemen terakhir dari array. Apa yang bisa menjadi masalah?

0
Mher Harutyunyan 10 Maret 2017, 22:27

2 jawaban

Jawaban Terbaik

Masalah inisialisasi array - ubah ke:

dirs=($(find * -maxdepth 0 -type d))

Namun, pernyataan di atas dapat menjadi masalah jika Anda memiliki direktori yang memiliki spasi putih di dalamnya.

Anda dapat menggunakan gumpalan sederhana sebagai gantinya - ini juga menangani spasi putih:

cd /var/www
dirs=(*/)
for dir in "${dirs[@]}"; do
  : your code
done
0
codeforester 10 Maret 2017, 20:29

Jika Anda menggunakan bash 4.4 khususnya, Anda dapat menggunakan fitur readarray seperti di bawah ini. Juga menggunakan -maxdepth 0 tampaknya bukan pilihan yang baik - Anda mungkin perlu menggunakan -maxdepth 1.

#!/bin/bash
cd /var/www
readarray -t -d'' dirs < <$(find . -maxdepth 1 -type d -print0)

for dir in "${dirs[@]}"; do
        echo $dir
        mkdir $dir/backups
done

Tetapi jika Anda dapat melakukan semuanya hanya dengan find dan mkdir -v (verbose):

$ find . -maxdepth 1 -type d -name 'a*'
./appsfiles

$ find . -maxdepth 1 -type d -name 'a*' -exec mkdir -v {}/backup \;
mkdir: created directory './appsfiles/backup'

Menggunakan mkdir -v Anda mendapatkan pesan verbose dari mkdir dan Anda dapat melewati gema.
Jika Anda tetap membutuhkan gema, Anda dapat melakukannya seperti:

$ find . -maxdepth 1 -type d -name 'a*' -exec bash -c 'echo $0 && mkdir -v $0/backup' {} \;
./appsfiles
mkdir: created directory './appsfiles/backup'
1
George Vasiliou 10 Maret 2017, 20:21