daftar file dalam direktori tanpa daftar subdirektori dan isinya di direktori itu

24

Saya ingin membuat daftar semua file dalam direktori, tanpa mendaftar subdirektori yang berada di direktori yang sama, dan mencetak daftar itu ke file baru.

ls -d * > filelist

akan membuat daftar semua file di direktori saat ini, tetapi juga daftar subdirektori di direktori saat ini. Saya mencoba findperintah menggunakan -maxdepth 1opsi - namun, format output adalah masalah karena menemukan juga mencetak jalan bersama dengan nama file.

Jika ada yang bisa tolong beri tahu saya mungkin perintah atau opsi lain untuk digunakan yang akan menghasilkan daftar output hanya file dalam direktori dan bukan nama-nama subdirektori atau isinya, saya akan sangat menghargainya.

janet
sumber
2
Saya bingung ls -d *hanya mencantumkan file dan folder di folder saat ini tidak termasuk file / folder tersembunyi di sini;
GM-Script-Writer-62850
ya, tetapi saya tidak ingin folder dalam direktori itu terdaftar, hanya ingin file dalam direktori itu terdaftar
janet

Jawaban:

22

Temukan solusi berbasis:

find . -maxdepth 1 -type f -printf '%f\n'

Solusi berbasis bash:

for f in *; do [[ -d "$f" ]] || echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -d "$f" ]] || ls -- "$f"; done

Solusi berbasis bash akan memberi Anda segala sesuatu yang bukan direktori; itu akan mencakup hal-hal seperti pipa bernama (Anda mungkin menginginkan ini). Jika Anda secara khusus ingin hanya file , gunakan findperintah atau salah satu dari ini:

for f in *; do [[ -f "$f" ]] && echo "$f"; done
##  or, if you want coloured output:
for f in *; do [[ -f "$f" ]] && ls -- "$f"; done

Jika Anda akan menggunakan ini secara rutin, tentu saja Anda dapat memasukkan ini ke alias di suatu tempat di ~/.bashrc:

alias lsfiles='for f in *; do [[ -f "$f" ]] && ls -- "$f"; done'

Karena Anda mencatat di komentar bahwa Anda sebenarnya menggunakan OSX daripada Ubuntu, saya sarankan Anda lain kali mengajukan pertanyaan ke Apple atau situs Unix & Linux Stack Exchange yang lebih umum .

Evilsoup
sumber
1
Pastikan untuk memeriksa apakah solusi ini tepat untuk Anda berdasarkan pada apakah Anda ingin menyertakan file tersembunyi atau tidak.
Kevin Wheeler
10

Daftar nama file saja:

1. ls -p | grep -v / (tanpa file tersembunyi)
 2. ls-l | grep ^ - | tr -s '' | cut -d '' -f 9 (tanpa file tersembunyi)

 a) ls -pa | grep -v / (dengan file tersembunyi)
 b) ls -la | grep ^ - | tr -s '' | cut -d '' -f (dengan file tersembunyi)

Daftar direktori saja:

1. ls -p | grep / (tanpa disembunyikan)
 2. ls-l | grep ^ d | tr -s '' | cut -d '' -f 9 (tanpa disembunyikan)

 a) ls -pa | grep / (dengan disembunyikan)
 b) ls-l | grep ^ d | tr -s '' | cut -d '' -f 9 (dengan disembunyikan)

grep -v -e ^ $ adalah untuk menghapus baris kosong dari hasilnya.

Lebih detail :
ls -p flag adalah untuk meletakkan '/' di akhir nama direktori, -R flag adalah untuk pencarian rekursif, -l untuk daftar dengan info, -a untuk daftar semua (termasuk file tersembunyi) dengan info, grep -v flag untuk invertion hasil dan flag -e untuk pencocokan regex.

Andananda
sumber
7

Untuk daftar file biasa saja:

ls -al | grep ^-

Termasuk tautan simbolis:

ls -al | grep ^[-l]

Di mana karakter pertama dari daftar menjelaskan jenis file, jadi itu -berarti file biasa, untuk tautan simbolik l.

Debian / Ubuntu

Cetak nama semua file yang cocok (termasuk tautan):

run-parts --list --regex . .

Dengan jalur absolut:

run-parts --list --regex . $PWD

Cetak nama semua file /etcyang dimulai dengan pdan diakhiri dengan d:

run-parts --list --regex '^p.*d$' /etc
kenorb
sumber
5

Namun solusi lain, solusi singkat naif yang bekerja untuk saya:

ls -la | grep -E '^[^d]' > files
arsaKasra
sumber
sempurna untukku,ls -alR |grep -E '^-'
sini
4

Saya akan menyarankan untuk menggunakan find dan hapus saja nama direktori dari output jika perlu:

find . -type f -maxdepth 1 | sed s,^./,,
Cougar
sumber
2
-maxdepth 1harus ada sebelum filter apa pun, dan Anda dapat mencapai hasil ini tanpa menggunakan seddengan -printfopsi, yaitu: find . -maxdepth 1 -type f -printf '%f\n'(ini akan lebih efisien daripada menggunakan program tambahan).
evilsoup
3
ls -1 --file-type | grep -v '/' | sed s/@$// > filelist

Opsi lain yang mungkin adalah

ls -F | grep -v '/' | sed /[@*]$// > filelist

The --file-typemenempatkan a / pada akhir folder (tetapi juga @ pada akhir link simbolik. The grep -v '/'Menghilangkan subdirektori (karena mereka sekarang berakhir dengan '/'). The sed s/@$//Menghapus yang @. -1 cetakan satu file per baris sehingga grep -v akan bekerja dengan benar.

Dr.Tower
sumber
Terima kasih atas tanggapan Anda. sayangnya, itu tidak berfungsi untuk saya, mungkin saya mengeksekusi salah. jika saya menggunakan perintah persis yang Anda berikan kepada saya, saya mendapatkan kesalahan berikut: ls: opsi ilegal - - penggunaan: ls [-ABCFGHLPRSTWabcdefghiklmnopqrstuwx1] [file ...] saya mencoba menggunakan karakter wildcard * di tempat juga di bersama dengan --file-type. jika Anda bisa mengklarifikasi saya akan sangat menghargainya!
janet
Perintah itu berfungsi untuk saya (menjalankan 13.04), apa versi ubuntu yang Anda gunakan ?; -1tidak masalah untuk menangkap Anda tidak membutuhkannya; jika Anda ingin menyertakan file tersembunyi gunakan -aopsi padals
GM-Script-Writer-62850
sebenarnya, saya sedang mengerjakan mac. mungkin perintahnya sedikit berbeda pada mac os x atau unix?
janet
1
Anda juga dapat mencobals -F | grep -v '/' | sed s/[@*]$// > filelist
Dr.Tower