Saya sedang menulis skrip dalam bash di Linux dan harus melalui semua nama subdirektori dalam direktori yang diberikan. Bagaimana saya bisa mengulang direktori ini (dan melewati file biasa)?
Sebagai contoh:
direktori yang diberikan adalah /tmp/
ia memiliki subdirektori berikut:/tmp/A, /tmp/B, /tmp/C
Saya ingin mengambil A, B, C.
Jawaban:
Penjelasan singkat:
find
menemukan file (cukup jelas).
adalah direktori saat ini, yang setelahcd
itu/tmp
(IMHO ini lebih fleksibel daripada memiliki/tmp
langsung dalamfind
perintah. Anda hanya memiliki satu tempat, yaitucd
, untuk berubah, jika Anda ingin lebih banyak tindakan terjadi di folder ini)-maxdepth 1
dan-mindepth 1
pastikan itufind
hanya terlihat di direktori saat ini dan tidak termasuk.
dalam hasilnya-type d
hanya mencari direktori-printf '%f\n
hanya mencetak nama folder yang ditemukan (plus baris baru) untuk setiap klik.Dan lagi!
sumber
while..done
loop Anda bisa menjadi gila.find
's-exec
pilihan memungkinkan Anda menjalankan perintah apapun untuk setiap file / direktori.Semua jawaban sejauh ini digunakan
find
, jadi ini satu-satunya jawaban. Tidak perlu alat eksternal dalam kasus Anda:sumber
find
ketika Anda dapat menambahkan tebasan ke wildcardfor dir in */; do echo $dir; done
juga untuk direktori di direktori saat ini.dir=${dir%*/}
dan apa yangecho ${dir##*/}
sedang dilakukan./tmp/*/
, akan lebih bijaksana untuk menyertakan cek untuk melihat apakah direktori tersebut benar-benar ada.Anda dapat mengulangi semua direktori termasuk direktori tersembunyi (dimulai dengan titik) dengan:
Catatan: menggunakan daftar hanya
*/ .*/
berfungsi di zsh jika ada setidaknya satu direktori tersembunyi di folder. Dalam bash itu akan ditampilkan juga.
dan..
Kemungkinan lain untuk bash untuk memasukkan direktori tersembunyi adalah menggunakan:
Jika Anda ingin mengecualikan symlink:
Untuk menampilkan hanya nama direktori tambahan (A, B, C seperti yang dipertanyakan) di setiap solusi gunakan ini di dalam loop:
Contoh (ini juga berfungsi dengan direktori yang berisi spasi):
sumber
Bekerja dengan direktori yang berisi spasi
Terinspirasi oleh Sorpigal
Pos asli (Tidak berfungsi dengan spasi)
Terinspirasi oleh Boldewyn : Contoh loop dengan
find
perintah.sumber
sumber
basename
. Saya lebih suka ini daripada jawaban saya.Teknik yang paling sering saya gunakan adalah
find | xargs
. Misalnya, jika Anda ingin membuat setiap file dalam direktori ini dan semua subdirektori yang dapat dibaca dunia, Anda dapat melakukannya:The
-print0
pilihan berakhir dengan karakter NULL bukan spasi. The-0
pilihan membagi input dengan cara yang sama. Jadi ini adalah kombinasi yang digunakan pada file dengan spasi.Anda dapat menggambarkan rantai perintah ini dengan mengambil setiap output baris dengan
find
dan menempelkannya di akhirchmod
perintah.Jika perintah yang ingin Anda jalankan sebagai argumennya di tengah alih-alih di akhir, Anda harus sedikit kreatif. Sebagai contoh, saya perlu mengubah ke setiap subdirektori dan menjalankan perintah
latemk -c
. Jadi saya menggunakan (dari Wikipedia ):Ini memiliki efek
for dir $(subdirs); do stuff; done
, tetapi aman untuk direktori dengan spasi di namanya. Selain itu, panggilan terpisah untukstuff
dibuat dalam shell yang sama, itulah sebabnya dalam perintah saya kita harus kembali ke direktori saat ini denganpopd
.sumber
loop bash minimal yang bisa Anda buat (berdasarkan jawaban ghostdog74)
untuk zip sejumlah file dengan direktori
sumber
directory
, bukan hanya subdirektori.find . -type d -maxdepth 1
sumber
Jika Anda ingin menjalankan beberapa perintah dalam for for, Anda dapat menyimpan hasil
find
denganmapfile
(bash> = 4) sebagai variabel dan melalui array dengan${dirlist[@]}
. Ini juga berfungsi dengan direktori yang berisi spasi.The
find
perintah didasarkan pada jawaban oleh Boldewyn. Informasi lebih lanjut tentangfind
perintah dapat ditemukan di sana.sumber