GNU/Linux >> Belajar Linux >  >> Linux

Dapatkan Semua File Tapi File Dalam Array – Bash?

Saya diminta untuk menulis util satu kali yang melakukan beberapa operasi pada semua file dalam direktori yang diberikan tetapi daftar file dalam daftar yang telah ditentukan. Karena daftar yang diberikan sudah ditentukan sebelumnya, saya akan melakukan hard-code sebagai array.

Karena itu, bagaimana cara mendapatkan nama semua file yang tidak ada dalam array yang diberikan? Ini bisa dalam skrip unix standar (bash, awk, perl).

Jawaban yang Diterima:

Dengan bash , Anda dapat melakukan:

all=(*)
except=(file1 file2 notme.txt)
only=()
IFS=/
for file in "${all[@]}"; do
  case "/${except[*]}/" in
    (*"/$file/"*) ;;     # do nothing (exclude)
    (*) only+=("$file")  # add to the array
  esac
done
ls -ld -- "${only[@]}"

(yang berfungsi di sini untuk file di direktori saat ini, tetapi tidak dapat diandalkan untuk gumpalan seperti all=(*/*) except=(foo/bar) seperti yang kita gunakan / untuk menggabungkan elemen larik untuk pencarian).

Ini didasarkan pada fakta bahwa "${array[*]}" menggabungkan elemen array dengan karakter pertama $IFS (di sini dipilih menjadi / karena tidak dapat terjadi dalam file nama; NUL adalah karakter yang tidak dapat muncul di file path , tapi sayangnya bash (berlawanan dengan zsh ) tidak dapat memiliki karakter seperti itu dalam variabelnya). Jadi untuk setiap file di $all (di sini dengan $file menjadi foo sebagai contoh), kita membuat case "/file1/file2/notme.txt/" in (*"/foo/"*) untuk memeriksa apakah $file harus dikecualikan.


Linux
  1. Tutorial Bash Array Terbaik dengan 15 Contoh

  2. Skrip Bash untuk menghapus semua file kecuali N saat diurutkan menurut abjad

  3. Cara mendapatkan semua file yang melebihi ukuran tertentu dan menghapusnya

  1. Cara mendapatkan status keluar satu lingkaran di bash

  2. Hapus semua file kecuali 3 terbaru dalam skrip bash

  3. Bagaimana cara mendapatkan ukuran direktori sebenarnya (keluar dari du)?

  1. Dapatkan Daftar Semua File Dengan Mask Di Terminal?

  2. Hapus semua kecuali 1000 file acak dalam direktori

  3. Buat array dengan semua antarmuka jaringan di bash