Saya memiliki dua folder dengan struktur subfolder yang serupa, yang ingin saya bandingkan. Sebagai contoh:
A
├── child-1
├── child-2
├── child-3
├── child-4
├── child-5
dan
B
├── child-1-some-text
├── child-2-more-text
├── child-3-nothing
├── child-6-random-text
├── child-7-more-random-text
Saya ingin membuat daftar semua subfolder dari A
yang merupakan awalan untuk subfolder B
dan daftar subfolder yang sesuai dari B
juga. Output yang diharapkan adalah
child-1 -- child-1-some-text
child-2 -- child-2-more-text
child-3 -- child-3-nothing
Persyaratan sekunder: Jika banyak yang cocok B
, maka harus memberikan kesalahan / peringatan.
Solusi saya :
cd A
for f in `ls -d */`;
do
cd B;
new_dirs=(`ls -1d $f*`);
cd -;
if [ ${#new_dirs[@]} -eq 0 ]
then
## DO_Nothing
continue;
elif [ ${#new_dirs[@]} -gt 1 ]
then
echo "Multiple matches to $f";
continue;
else
echo "Unique Match found to $f -- ${new_dirs[0]}";
continue;
fi;
done
Masalah:
Untuk nilai-nilai dari $f
, yang tidak memiliki subfolder yang sesuai B
, konstruksi array memberi saya kesalahan. misalnya:
ls: tidak dapat mengakses 'child-4 *': Tidak ada file atau direktori tersebut
Pertanyaan
- Bagaimana cara menghilangkan kesalahan ini?
- Apakah ada cara yang lebih baik untuk mencapai tujuan daripada yang ada di kode saya?
Terima kasih sebelumnya!
diff -rq DIR1 DIR2
untuk membandingkan tidak hanya struktur direktori, tetapi isi file.Jawaban:
Cara yang lebih baik
Jangan diurai
ls
; gunakan gumpalan sebagai gantinya. Bahkan Anda sudah menggunakan gumpalan, hanya membungkusnyals
, yang tidak ada gunanya. Anda hanya perlunullglob
dihidupkan ketika tidak ada kecocokan.Juga menghindari
cd
hal-hal yang disederhanakan.Keluaran:
Saya menambahkan
B/child-3-something
untuk menguji persyaratan sekunder. Ini menciptakan struktur direktori untuk pengujian:Omong-omong, ShellCheck sangat berguna untuk menemukan masalah dalam skrip shell.
sumber
shellcheck
paket akan menjadi yang paling aman]ShellCheck
. Saya menyukai bagian yang tidak hanya memberi tahu Anda kesalahan Anda, tetapi juga memberikan saran! @ Xen2050, tentang bagian pengunggahan, saya baru saja menginstalshellcheck
menggunakanapt
dan kemudian menonaktifkan jaringan. Tampaknya berfungsi tanpa internet .Memanggil
ls
folder yang tidak ada melempar pesan kesalahan yang Anda temui. Cara mudah adalah dengan hanya mengabaikan ini dengan mengganti baris 5 di naskah Anda dengan ini:new_dirs=(`ls -1d $f* 2> /dev/null`);
.sumber
t=(`echo ok; echo err 1>&2`)
$ t (atau${t[@]}
) hanya berisi ok, err terlihat di terminal tetapi tidak disimpan. Atau adakah yang lucu dengan ujian saya?