Saya memiliki folder dengan beberapa direktori dan beberapa file (ada yang disembunyikan, dimulai dengan titik).
for d in *; do
echo $d
done
akan mengulang semua file, tetapi saya hanya ingin mengulang melalui direktori. Bagaimana aku melakukan itu?
[[ -L $d ]]
apakah $ d adalah tautan simbolik.set -P
hanya memengaruhi perintah yang mengubah direktori. sprunge.us/TNac[[ -L "$f" ]]
tidak akan mengecualikan symlink dalam hal ini dengan*/
, Anda harus menghapus garis miring dengan[[ -L "${f%/}" ]]
(lihat Tes untuk tautan dengan garis miring )Anda dapat menguji dengan
-d
:Ini adalah salah satu operator pengujian file .
sumber
if [[ -d "$f" && ! -L "$f" ]]
akan mengecualikan symlinkif [[ "$f" = "*" ]]; then continue; fi
Waspadalah bahwa solusi choroba, meskipun elegan, dapat menimbulkan perilaku yang tidak terduga jika tidak ada direktori yang tersedia dalam direktori saat ini. Dalam keadaan ini, alih-alih melewatkan
for
loop, bash akan menjalankan loop tepat sekali di manad
sama dengan*/
:Saya sarankan menggunakan yang berikut ini untuk melindungi dari kasus ini:
Kode ini akan mengulang semua file dalam direktori saat ini, memeriksa apakah
f
direktori, lalu menggemaf
jika kondisinya kembali benar. Jikaf
sama dengan*/
,echo $f
tidak akan dieksekusi.sumber
shopt -s nullglob
.Jika Anda perlu memilih file yang lebih spesifik daripada hanya menggunakan direktori
find
dan meneruskannya kewhile read
:Gunakan
shopt -u dotglob
untuk mengecualikan direktori tersembunyi (atausetopt dotglob
/unsetopt dotglob
di zsh).IFS=
untuk menghindari pemisahan nama file yang mengandung salah satu$IFS
, misalnya:'a b'
lihat jawaban AsymLabs di bawah ini untuk
find
opsi lebih lanjutsunting:
Jika Anda perlu membuat nilai keluar dari dalam loop sementara, Anda dapat menghindari subkulit tambahan dengan trik ini:
sumber
Anda dapat menggunakan bash murni untuk itu, tetapi lebih baik menggunakan find:
(temukan tambahan akan termasuk direktori tersembunyi)
sumber
shopt -s dotglob
untukbash
memasukkan direktori tersembunyi. Anda juga akan termasuk.
. Perhatikan juga bahwa-maxdepth
ini bukan opsi standar-prune
.dotglob
pilihan adalah menarik tapidotglob
hanya berlaku untuk penggunaan*
.find .
akan selalu menyertakan direktori tersembunyi (dan direktori saat ini juga)Ini dilakukan untuk menemukan direktori yang terlihat dan tersembunyi di dalam direktori kerja saat ini, tidak termasuk direktori root:
untuk hanya mengulang direktori:
untuk memasukkan symlink dalam hasil:
untuk melakukan sesuatu pada setiap direktori (tidak termasuk symlinks):
untuk mengecualikan direktori tersembunyi:
untuk menjalankan beberapa perintah pada nilai yang dikembalikan (contoh yang sangat dibuat-buat):
alih-alih 'sh -c' juga dapat menggunakan 'bash -c', dll.
sumber
... -print0 | xargs -0 ...
jika Anda tidak tahu nama sebenarnya.find * | while read file; do ...
Anda dapat mengulang semua direktori termasuk direktori tersembunyi (dimulai dengan titik) dalam satu baris dan beberapa perintah dengan:
Jika Anda ingin mengecualikan symlink:
catatan: menggunakan daftar
*/ .*/
berfungsi di bash, tetapi juga menampilkan folder.
dan..
sementara di zsh tidak akan menampilkan ini tetapi membuang kesalahan jika tidak ada file tersembunyi di folderVersi yang lebih bersih yang akan menyertakan direktori tersembunyi dan mengecualikan ../ akan dengan opsi dotglob:
(atau
setopt dotglob
dalam zsh)Anda dapat menghapus dotglob dengan
sumber
Ini akan mencakup jalur lengkap di setiap direktori dalam daftar:
sumber
Gunakan
find
dengan-exec
untuk mengulang direktori dan memanggil fungsi di opsi exec:Gunakan
shopt -s dotglob
ataushopt -u dotglob
untuk memasukkan / mengecualikan direktori tersembunyisumber
Ini daftar semua direktori bersama dengan jumlah sub-direktori di jalur yang diberikan:
sumber
sumber
This
is
one
directory
with
spaces
in
the
name
- tetapi diuraikan sebagai beberapa.atau:
Anda dapat mengaturnya sebagai alias
sumber
ls
jawaban berbasis ini , yang berisi daftar direktori.ls
: mywiki.wooledge.org/ParsingLs