Temukan nama file yang tidak mengandung string yang ditentukan

19

Saya ingin mengeksekusi kebalikan dari:

find . -name "*2013*"

Temukan semua file di direktori saat ini yang tidak mengandung string "2013" dalam nama mereka. Bagaimana saya bisa melakukan itu?

pengguna1058398
sumber

Jawaban:

28

Secara sederhana:

find . ! -name '*2013*'

Tambahkan ! -type djuga untuk mengecualikan file dari direktori jenis (seperti .itu sendiri), atau -type fhanya menyertakan file biasa , tidak termasuk semua jenis file lainnya (direktori, fifos, symlink, perangkat, soket ...).

Hati-hati namun yang *cocok dengan urutan 0 atau lebih karakter . Jadi itu bisa melaporkan nama file yang berisi 2013jika 2013itu didahului atau diikuti oleh sesuatu yang tidak dapat sepenuhnya diterjemahkan sebagai karakter yang valid di lokal saat ini.

Itu bisa terjadi jika Anda berada di lokal tempat karakter dapat dikodekan pada lebih dari satu byte (seperti dalam UTF-8) untuk nama file yang dikodekan dalam pengkodean yang berbeda. Misalnya, di lokal UTF-8, ia akan melaporkan Stéphane2013file jika ételah dikodekan dalam set karakter iso8859-15 (seperti byte 0xe9).

Yang terbaik adalah memastikan nama file dikodekan dalam set karakter lokal, tetapi jika Anda tidak dapat menjaminnya, pekerjaan di sekitar akan dijalankan finddi lokal C:

LC_ALL=C find . ! -name '*2013*'
Stéphane Chazelas
sumber
4

Pola nama file Ksh cukup:

# files with 2013
ls -d -- *2013*

# files without 2013
ls -d -- !(*2013*)

Referensi

Jika shell Anda adalah bash, Anda harus menjalankannya shopt -s extglobsebelum Anda dapat menggunakan pola ini (Anda bisa memasukkannya ke dalam .bashrc). Jika shell Anda adalah zsh, Anda harus menjalankannya setopt ksh_glob(Anda dapat memasukkannya ke dalam .zshrc). Zsh juga menawarkan ls -d -- ^*2013*, yang membutuhkan pendahuluan setopt extended_glob.

Bergantung pada apa yang Anda lakukan dengan nama file ini, lsmungkin bukan perintah yang tepat untuk digunakan. Untuk menyimpannya dalam sebuah array

filenames=( !(*2013*) )
for f in "${filenames[@]}"; do ...; done
glenn jackman
sumber
4
Itu tidak berulang di subdirektori dan akan melewatkan file dot (dan lsakan mengembalikan pesan kesalahan jika pola tidak cocok dengan file apa pun). Perhatikan juga bahwa kshakan mengurutkan daftar.
Stéphane Chazelas
-1

Temukan semua file di direktori saat ini yang tidak mengandung string tertentu, di sini "2013":

find . ! -name "*2013*" -type f
pengguna7194913
sumber
2
Ini pada dasarnya sama dengan unix.stackexchange.com/a/102614/117549 dari 3 tahun yang lalu, kecuali Anda telah menambahkan "-f" yang membuat ini menjadi jawaban yang lebih buruk.
Jeff Schaller