GNU/Linux >> Belajar Linux >  >> Linux

Bagaimana cara menampilkan nama file yang mengandung dua karakter dan salah satunya adalah c?

Dengan bash, atur pengaturan glob sehingga kecocokan yang hilang tidak memicu kesalahan:

shopt -u failglob  # avoid failure report (and discarding the whole line).
shopt -s nullglob  # remove (erase) non-matching globs.
ls ?c c?

Tanda tanya adalah karakter glob yang mewakili satu karakter. Karena Anda menginginkan nama file dua karakter, salah satunya harus berupa c , dan jadi itu adalah karakter pertama atau karakter terakhir.

Dengan shopt -s dotglob ini juga akan menampilkan file bernama .c .

Jika tidak ada file yang cocok, menyetel opsi shell ini menyebabkan semua argumen dihapus, menghasilkan ls kosong -- mencantumkan apa saja/semuanya secara default.

Gunakan ini sebagai gantinya:

shopt -s nullglob  ## drop any missing globs
set -- ?c c?       ## populate the [email protected] array with (any) matches
if [ $# -gt 0 ]    ## if there are some, list them
  ls -d "[email protected]"
fi

Saya pikir cara yang lebih baik adalah dengan menggunakan find :

find . -type f -name '*c*' -name '??'

Itu akan mencari secara rekursif. Untuk mencantumkan hanya file di direktori saat ini:

find . ! -name . -prune  -type f -name '*c*' -name '??'

Jika file ada (dan tidak ada karakter yang lolos seperti \c ), Anda dapat menggunakan glob:

echo ?c c?

yang akan mencocokkan file yang memiliki satu karakter (? ) diikuti dengan c atau yang memiliki c diikuti oleh satu karakter (? ).

Tetapi akan gagal dengan nama file yang dimulai dengan tanda hubung seperti -n atau -e atau dengan karakter backslash seperti \c atau \n dengan echo sebagai -e dan -n khusus untuk (beberapa shell) echo dan \c atau \n akan ditafsirkan sebagai urutan pelarian (\c mengakhiri output dan \n mencetak baris baru, bukan karakter verbatim \n dalam beberapa implementasi shell gema dan dengan bash ketika opsi shopt -s xpg_echo diatur). Aplikasi atau utilitas lain (seperti ls ) akan memiliki beberapa opsi lain dan mungkin gagal dengan banyak tanda hubung lain yang dimulai atau menginterpretasikan karakter escape lain dalam nama file.

Juga akan mencantumkan file bernama cc dua kali.

  • Jika file dapat dimulai dengan tanda hubung (seperti -n), gunakan:

    $ ls -d -- ?n 
    -n 
    

    Atau, lebih baik:

    $ ls -d ./?n
    ./-n
    

Peringatan

  • Glob tidak cocok dengan file.

    1. Jika file tidak ada, glob tidak akan diperluas dan glob akan dicetak dalam bentuk aslinya.

      $ echo ?m m?
      ?m m?
      
    2. Kecuali di zsh.

      $ zsh -c 'echo ?m m?'
      zsh:1: no matches found: ./m?
      

      Shell akan keluar dengan kesalahan.
      Perilaku ini dikendalikan oleh nomatch Zsh opsi.

      $ zsh -c 'setopt +o nomatch; echo ?m m?'
      ?m m?
      

      Atau:

      $ zsh -c 'echo ?m(N) m?(N)'
      ?m m?
      

      Tapi itu akan mencetak mm dua kali.

    3. Di bash Anda bisa mendapatkan hasil yang mirip dengan zsh jika opsi shell failglob diatur:

      $ bash -c 'shopt -s failglob; echo ?m m?'
      bash: no match: ?m
      

      Tetapi skrip tidak akan berhenti, shell tidak akan keluar. Yah, secara teknis, baris di mana glob digunakan tidak dieksekusi lebih lanjut tetapi eksekusi dilanjutkan pada baris skrip berikutnya.

    4. Di bash Anda bisa mengatur opsi nullglob untuk menghapus gumpalan yang tidak cocok:

      $ bash -c 'shopt -s nullglob; echo ?m m? done'
      done
      
  • Menggunakan ls (mirip dengan program lain)

    1. Dengan file yang cocok tidak akan ada masalah, tetapi juga akan cocok (dan mencantumkan) direktori:

      $ ls ?c c?
      bc  cz  sc
      
      ac:
      hjk
      

      Lebih baik gunakan -d dengan ls (direktori akan disertakan tetapi tidak diperluas).

      $ ls -d ?c c?
      ac bc cz sc
      
    2. Gumpalan gagal mencocokkan file (atau direktori)

      Lalu ls akan melaporkan kegagalan

      $ ls ?m m?
      ls: cannot access '?m': No such file or directory
      

      Program lain mungkin (mungkin) melakukannya tidak lakukan pemeriksaan serupa.

    3. Menggunakan nullglob dengan bash akan memberikan daftar kosong ke ls, jadi, itu akan mencantumkan konten atau pwd seolah-olah hanya ls dieksekusi:

      $ ls ?m m?
      ac a.out cz 3 b sc ab bc
      

      Itu bisa dihindari menggunakan ./

      $ ls -d ./?m ./m?
      ls: cannot access './?m': No such file or directory
      ls: cannot access './m?': No such file or directory
      

Atau Anda dapat menggunakan regex find (tetapi akan melintasi subdirektori dengan prune hilang) (Perhatikan bahwa ini tidak akan mengulangi file bernama cc):

    $ find . ! -name . -prune -regex '.*/\(.c\|c.\)'
    ./ac
    ./cc
    ./sc
    ./bc
    ./cz

Linux
  1. `^m` Dan Bagaimana Cara Menghilangkannya?

  2. Bagaimana Cara Menampilkan Penyorotan Sintaks Pada File?

  3. Grep Bagaimana Cara Menekan Tampilan File yang Tidak Cocok?

  1. Bagaimana cara mengosongkan (memotong) file di linux yang sudah ada dan dilindungi?

  2. Bagaimana cara menggabungkan beberapa baris nama file menjadi satu dengan pembatas khusus?

  3. bagaimana saya bisa mencari file dan meng-zip-nya dalam satu file zip

  1. Cara menyentuh file dan mkdir jika diperlukan dalam satu baris

  2. AWK dan nama file dengan spasi di dalamnya.

  3. Bagaimana cara mendapatkan baris yang berisi string dalam file?