GNU/Linux >> Belajar Linux >  >> Linux

Dapatkan Pelengkap Dari Hasil Perintah Ls?

Katakanlah saya memiliki direktori dengan banyak file, semuanya adalah file biner (file tanpa ekstensi yang dideklarasikan) dan file sumber (.c perpanjangan). Saya melakukan ini:

$ ls

dan dapatkan:

README.md hello-world.c hello-world get-name.c get-name

dan saya hanya ingin membuat daftar file dengan ekstensi tertentu (katakan keduanya .c dan .md ), saya lakukan:

ls *.c *.md

dan tidak apa-apa!

Tapi bagaimana jika sekarang saya ingin menghapus semua file yang tidak memiliki .c atau .md ekstensi, bagaimana saya bisa melakukan ini?

Saya tahu cara melakukannya pada file yang ekstensinya saya ketahui, seperti:

ls *.c *.md | xargs rm

Tetapi bagaimana cara memberi tahu baris perintah untuk menghapus file yang JANGAN cocok dengan kriteria saya?

Jawaban yang Diterima:

Gunakan find :

find -maxdepth 1 ! -name "*.c" -print0 | xargs -0 ...

Perhatikan bahwa -maxdepth , -print0 , -r dan -0 ditemukan di beberapa find implementasi (diperkenalkan oleh GNU find /xargs ) tetapi tidak ditentukan oleh POSIX. Cara lain adalah, seperti yang disebutkan Stéphane dalam komentarnya, menggunakan -exec aksi menemukan – ingatlah untuk menggunakan perintah -exec command {} + form, karena secara dramatis mengurangi jumlah pemanggilan command (itu harus mengizinkan sintaks di mana nama file ditempatkan di akhir, atau Anda harus membungkus command di dalam sh -c telepon).

Atau grep keluaran ls

ls | grep -v ".c$" | xargs ...

Anda dapat memfilter beberapa ekstensi baik dengan ekspresi reguler:

... | grep -v ".(c|md)$" | ...

dengan regexp yang diperluas:

... | grep -Ev ".(c|md)$" | ...

dengan opsi string tetap (tidak akan cocok hanya di akhir nama file!):

... | grep -vF ".c
.md" | ...

atau dengan merangkai lebih banyak grep s:

... | grep -v ".c$" | grep -v ".md$" | ...

Yang mengatakan, find mungkin merupakan opsi terbaik, karena dengan -print0 opsi itu menangani semua karakter yang mungkin dalam nama file yang mungkin perlu melarikan diri jika tidak (asalkan find Anda dan xargs dapat bekerja dengan string yang diakhiri NULL – mis. alat GNU adalah).


Linux
  1. Hasil Ls * , Ls ** Dan Ls ***?

  2. Apa Perbedaan Get Command Output Menggunakan`command`dan $(command) Di Shell??

  3. Perintah untuk mendapatkan status sinkronisasi file Dropbox

  1. Bagaimana cara mendapatkan URL file Dropbox dari baris perintah?

  2. Buka file yang diberikan oleh hasil perintah di vim

  3. Bagaimana cara mendapatkan alamat IP saya dari baris perintah?

  1. Diurutkan dengan sort di baris perintah

  2. Kuasai perintah Linux ls

  3. 4 tips untuk membantu Anda mendapatkan hasil maksimal dari perintah df Linux