it-swarm-id.com

Cara daftar file tanpa direktori, dan filter berdasarkan nama (opsi ls)

Saya memiliki direktori bernama uploads. Ini berisi banyak file, ditambah beberapa subdirektori yang pada gilirannya berisi file.

Apakah ada cara saya dapat (dalam satu langkah) melakukan hal berikut:

  1. Daftarkan HANYA file dalam direktori unggahan root - Saya tidak ingin melihat nama subfolder atau isinya;

    dan

  2. JANGAN daftar file yang dimulai dengan t_

Saya tahu tentang -d flag, tetapi itu tidak membuat saya mendapatkan apa yang saya inginkan.

45
EmmyS

Ini terdengar seperti pekerjaan untuk find.

  • Gunakan -maxdepth untuk hanya mengembalikan direktori saat ini, tidak mencari di dalam subfolder secara berulang
  • Gunakan -type f untuk hanya mengembalikan file dan bukan direktori atau node perangkat atau apa pun
  • Gunakan kombinasi jika -not dan -name untuk menghindari file dengan nama yang tidak Anda inginkan

Mungkin datang bersama seperti ini:

find /path/to/uploads -maxdepth 1 -type f -not -name 't_*'
55
Caleb

GNU ls (mis. Perintah ls pada sistem Linux yang tidak tertanam dan Cygwin, juga tersedia di beberapa unit lain) memiliki opsi untuk menyembunyikan beberapa file, berdasarkan namanya. Tidak ada cara untuk mengabaikan direktori.

ls --hide='t_*' uploads

Pendekatan lain adalah membuat Shell Anda melakukan pencocokan. Bash, ksh dan zsh memiliki pola negasi !(t_*) untuk mencocokkan semua file kecuali yang cocok t*; di bash fitur ini harus dinyalakan dengan shopt -s extglob, dan di zsh perlu dinyalakan dengan setopt ksh_glob. Zsh juga memiliki sintaks yang setara ^t_* Yang perlu dinyalakan dengan setopt extended_glob. Ini masih tidak mengabaikan direktori. Zsh memiliki fitur tambahan yang memungkinkan untuk mencocokkan file tidak hanya dengan nama tetapi juga dengan metadata dan banyak lagi: kualifikasi global . Tambahkan (.) Di akhir pertandingan untuk membatasi ke file biasa. Negasi ^ Adalah bagian dari sintaksis pencocokan nama, jadi ^t_*(.) berarti “semua file biasa tidak cocok dengan t_*” Dan bukan “semua file yang bukan file biasa cocok dengan t_* ”.

setopt extended_glob  # put this in your ~/.zshrc
ls uploads/^t_*(.)

Jika Anda menemukan diri Anda tanpa alat-alat canggih, Anda dapat melakukan ini di setiap unix dengan find Ini bukan jenis yang biasanya Anda ketik di baris perintah, tetapi kuat dan tepat. Caleb telah menunjukkan cara melakukan ini dengan GNU find . Opsi -maxdepth Tidak portabel; Anda dapat menggunakan -Prune sebagai gantinya, untuk menghentikan pengulangan find secara portable.

find uploads/* -type d -Prune -o \! -type f -name 't_*' -print

Ganti -print Dengan -exec ls -lG -- {} + Untuk menjalankan ls dengan opsi favorit Anda pada file.

Semua perintah di atas menyembunyikan file dot (mis. File yang namanya dimulai dengan .). Jika Anda ingin menampilkannya, kirimkan -A Ke ls, atau tambahkan D kualifikasi global dalam zsh (ls uploads/^t_*(.D)). Dengan find, Anda dapat menggunakan pendekatan berbeda untuk membuatnya hanya muncul satu tingkat saja (find tidak memperlakukan file titik secara khusus). Ini hanya berfungsi jika Anda menjalankan find di direktori saat ini.

cd uploads && find . -name . -o -type d -Prune -o \! -type f -name 't_*' -print
ls -l /folder | grep ^- | awk '{print $9}'
10
Krayher
ls -l | grep -v ^d | grep name$

Jika masalah portabilitas -maxdepth menjadi perhatian, Anda dapat menggunakan:

ls -l uploads/ | awk '/^-/ && $9 !~/^t_/ {print $9}'

Saya bukan ahli, tapi saya pikir ini harus berhasil. Saya kira itu terlihat sedikit samar, tetapi jika Anda berbicara awk, sebenarnya tidak. $ NF bisa digunakan sebagai pengganti $ 9. Anda juga bisa:

ls -l uploads/ | awk '/^-/' | awk '!/^t_/ {print $9}'

yang melakukan hal yang sama (tapi mungkin kurang efisien daripada yang sebelumnya ???).

Sebenarnya, setelah memikirkan postingan lain, sepertinya

ls -l --hide=t_* uploads/ | awk '/^-/ {print $9}'

adalah cara yang lebih pendek dan lebih jelas.

Seseorang tolong perbaiki saya jika saya salah. :-)

0
kkaszub

Saya menemukan cara-cara singkat ini:

ls -p uploads | grep -Ev '/'

atau

ls -pIt_* uploads | grep -v /
0
Radu Rădeanu

Biarkan saya mencobanya menggunakan ls dan pipa:

ls  -l --hide='t_*'  uploads/ | grep -v ^d | tr -s ' ' | cut -d ' ' -f 9

katakanlah kolom terakhir adalah yang ke-9.

0
Y0NG