Saya mencoba untuk mendapatkan isi direktori menggunakan skrip shell.
Skrip saya adalah:
for entry in `ls $search_dir`; do
echo $entry
done
di mana $search_dir
jalur relatif. Namun, $search_dir
berisi banyak file dengan spasi putih dalam namanya. Dalam hal ini, skrip ini tidak berjalan seperti yang diharapkan.
Saya tahu saya bisa menggunakan for entry in *
, tetapi itu hanya akan berfungsi untuk direktori saya saat ini.
Saya tahu saya dapat mengubah ke direktori itu, gunakan for entry in *
kemudian ubah kembali, tetapi situasi khusus saya mencegah saya melakukan itu.
Saya memiliki dua jalur relatif $search_dir
dan $work_dir
, dan saya harus mengerjakan keduanya secara bersamaan, membacanya membuat / menghapus file di dalamnya dll.
Jadi apa yang harus saya lakukan sekarang?
PS: Saya menggunakan bash.
bash
shell
directory-listing
jrharshath
sumber
sumber
for entry in "$search_dir/*"
tidak berhasil? Mengapa kita perlu menempatkan di/*
luar tanda kutip?find
akan lebih cepat?for entry in "${search_dir}/*"
Jawaban lain di sini luar biasa dan menjawab pertanyaan Anda, tetapi ini adalah hasil google teratas untuk "bash dapatkan daftar file dalam direktori", (yang saya cari untuk menyimpan daftar file) jadi saya pikir saya akan memposting jawaban untuk masalah itu:
Jika Anda hanya menginginkan jenis tertentu (mis. File .txt):
Perhatikan bahwa $ search_path adalah opsional; ls> filename.txt akan melakukan direktori saat ini.
sumber
ls
untuk mengurai nama file? Belum pernah mendengar ini sebelumnya.Ini adalah cara untuk melakukannya di mana sintaksinya lebih mudah bagi saya untuk mengerti:
./
adalah direktori aktif saat ini tetapi bisa diganti dengan jalur*.txt
apa saja mengembalikan apa pun.txtAnda dapat memeriksa apa yang akan terdaftar dengan mudah dengan mengetikkan
ls
perintah langsung ke terminal.Pada dasarnya, Anda membuat variabel yang
yourfilenames
berisi semua yang dikembalikan oleh perintah daftar sebagai elemen yang terpisah, dan kemudian Anda mengulanginya. Loop membuat variabel sementaraeachfile
yang berisi elemen tunggal dari variabel yang dilaluinya, dalam hal ini nama file. Ini belum tentu lebih baik daripada jawaban yang lain, tetapi saya merasa intuitif karena saya sudah terbiasa denganls
perintah dan sintaks for loop.sumber
A
,,B
danC
. Anda membuat file yang dipanggilB\nC
danD
, lalu memilih untuk menghapusnya. Perangkat lunak yang tidak menangani hak ini bisa berakhir dengan menghapus file yang sudah ada sebelumnya, B dan C bahkan jika Anda tidak memiliki izin untuk melakukan itu.)sumber
sumber
xargs -0 -i echo "{}"
perintah terakhir , mau jelaskan sedikit? Khususnya apa yang-i echo "{}"
dilakukan bagian itu? Saya juga membaca dariman
halaman yang-i
sudah usang sekarang dan kita harus menggunakan-I
insted.-i
pengganti{}
dengan arg.{}
adalah string yang diganti dengan yang sesuai denganfind
perintah.xargs
? secara default,find
cetak apa yang ditemukannya ... Anda dapat menghapus semuanya-print0
.Variasi
Catatan:
.
: folder saat ini-maxdepth 1
untuk mencari secara rekursif-type f
: cari file, bukan direktori (d
)-not -path '*/\.*'
: jangan kembali.hidden_files
sed 's/^\.\///g'
: hapus yang diawali./
dari daftar hasilsumber
Berikut cara lain untuk mendaftarkan file di dalam direktori (menggunakan alat yang berbeda, tidak seefisien beberapa jawaban lainnya).
echo *
Keluarkan semua file dari direktori saat ini. Thefor
Loop iterates atas setiap nama file dan mencetak ke stdout.Selain itu, Jika mencari direktori di dalam direktori maka letakkan ini di dalam
for
loop:test -d
memeriksa apakah file tersebut adalah direktori.sumber
Jawaban yang diterima tidak akan mengembalikan awalan file dengan a. Untuk melakukan itu gunakan
sumber
Pada versi Linux saya bekerja dengan (x86_64 GNU / Linux) bekerja sebagai berikut:
sumber
$search_dir
berarti rusak jika ada ruang dalam nama direktori. (Dalam hal ini Anda bisa lolos dengan tidak mengutip$entry
, tetapi akan lebih baik untuk mengutipnya.)mkdir "x y"; touch "x y/1.txt"; search_dir="x y"; for entry in $search_dir/*; do echo $entry; done
. Pengulangan berjalan dua kali, sekali pencetakanx
dan kedua kalinyay/*
, yang mungkin bukan hasil yang diharapkan.search_dir="x y"; for entry in $search_dir/*; do if [ -d "$entry" ]; then rm -rf "$entry"; fi; done
. Jika ada jugax
direktori di direktori saat ini, itu dihapus, hanya karena Anda tidak mengutip variabel Anda!Cukup masukkan perintah sederhana ini:
sumber