GNU/Linux >> Belajar Linux >  >> Linux

Bash:ls * tanpa pengelompokan folder

Tampaknya tidak mungkin tanpa perubahan keluaran, tetapi berikut adalah cara alternatif yang mudah:

find source/ -type f

Atau (khusus untuk penemuan GNU), untuk hanya mendapatkan file pada kedalaman pertanyaan Anda:

find source/ -type f -mindepth 2 -maxdepth 2

(atau jika Anda menginginkan direktori seperti ls memberi Anda, hapus -type f )


Anda dapat tetap menggunakan ls jika Anda menambahkan beberapa psychedlics (ls -d ):

# mkdir test
# cd test
# mkdir A B C
# touch {A,B,C}/file*
# ls -d */*    
A/file  B/file  C/file

Anda mungkin tertarik dengan “find orang miskin itu ”:

shopt -s globstar

shopt -s s ets opsi shell bernama. globstar opsi didefinisikan sebagai berikut dalam bash(1):

Jika disetel, polanya ** digunakan dalam konteks perluasan nama file/nama jalurakan cocok dengan file [sic] dan nol atau lebih direktori dan subdirektori. Jika pola diikuti oleh / , hanya direktori dan subdirektori yang cocok.

Jadi, setelah Anda selesai shopt -s globstar , salah satu dari perintah berikut:

ls -d1 -- source/**                 # The character after the ‘d’ is the digit one.
ls -d -- source/** | cat            # i.e., it will write that into a pipe to any command.
printf "%s\n" source/**

akan menghasilkan output:

source/
source/fonts
source/fonts/fontello
source/images
source/images/bg1.png
source/images/eng.png
source/images/fra.png

Sayangnya, ini termasuk nama direktori juga. Ini mungkin membantu Anda sedikit untuk mengetahui itu

printf "%s\n" source/**/

akan menghasilkan output:

source/
source/fonts
source/images

yaitu, hanya nama direktori. Anda dapat mengarahkan output dari salah satu rangkaian perintah pertama ke satu file, mengarahkan output di atas ke file kedua, lalu menggunakan comm , diff , atau yang serupa, untuk mengurangi file kedua dari yang pertama, hanya menyisakan file biasa (non-direktori). Tapi jangan lakukan itu.

Pendekatan lain (itu tidak banyak lebih baik) adalah

ls -d --file-type -- source/** | grep -v '/$'

--file-type opsi memberi tahu ls untuk menampilkan / di akhir setiap nama direktori (dan karakter lain di akhir tipe file (khusus) lainnya), seperti ini:

source//                            # Added an extra one
source/fonts/                       # Added one
source/fonts/fontello
source/images/                      # Added one
source/images/bg1.png
source/images/eng.png
source/images/fra.png

lalu grep -v '/$' menghapus baris yang diakhiri dengan /;yaitu, nama direktori. Sayangnya, --file-type opsi tidak ditentukan oleh POSIX. Jika versi ls Anda tidak mendukungnya, gunakan -F . Itu seperti --file-type kecuali itu juga menampilkan * di akhir nama file yang dapat dieksekusi, yang menurut sebagian orang mengganggu. Anda dapat menghilangkannya dengan sed :

ls -dF -- source/** | sed -e '/\/$/d' -e 's/\*$//'

Jika Anda ingin melakukan sesuatu dengan semua file (dan hanya file), Anda dapat melakukannya

for f in source/**
do
    if [ -f "$f" ]
    then
        Insert commands to be applied to plain files here.
    fi
done

Catatan:

  • Kapan ls sedang dikeluarkan ke terminal, dan tidak ada di -l (l ong) mode, ia menulis banyak nama per baris (kecuali jika namanya sangat panjang). Anda dapat memaksanya untuk menulis satu nama per baris dengan menentukan -1 (satu), atau dengan mengalihkan keluaran ke file atau pipa.
  • Anda mungkin tidak benar-benar membutuhkan -- di ls perintah karena Anda mencantumkan direktori yang isinya Anda buat. Anda harus menggunakannya saat mencantumkan * di direktori yang tidak diketahui, sebagai perlindungan terhadap nama file yang dimulai dengan - .
  • Jangan mencoba mengurai output dari ls .
  • globstar opsi shell tampaknya tidak ditentukan oleh POSIX. (Faktanya, saya tidak yakin POSIX mengenali apa pun Opsi shell.) Meskipun tampaknya menjadi bash isme, berhati-hatilah —itu mungkin tidak ada di semua versi bash.
  • Jika fonts atau images memiliki subdirektori, ** akan mencantumkan semuanya, secara rekursif, sepenuhnya. Salah satu cara (agak kotor dan tidak dapat diandalkan) untuk membatasi kedalaman adalah

    ls -d --file-type -- source/** | grep -v '\(/.*\)\{3\}'
    

    yang menghapus baris yang mengandung tiga atau lebih / karakter.


Linux
  1. Jalankan perintah bash pada pipa jenkins

  2. Memulihkan ~/.bashrc tanpa menggunakan perintah bash

  3. Skrip Bash untuk menghapus file terlama dari folder

  1. Bash Script Untuk Menghapus File Terlama Dari Folder A?

  2. penyelesaian file bash tanpa menentukan ./

  3. Gunakan .bashrc tanpa merusak sftp

  1. Ekstrak nama file dasar tanpa jalur dan ekstensi di bash

  2. Sejarah Bash tanpa nomor baris

  3. Bagaimana cara mengekstrak file tanpa struktur folder menggunakan tar