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?
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?
Jawaban:
Secara sederhana:
find . ! -name '*2013*'
Tambahkan ! -type d
juga untuk mengecualikan file dari direktori jenis (seperti .
itu sendiri), atau -type f
hanya 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 2013
jika 2013
itu 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éphane2013
file 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 find
di lokal C:
LC_ALL=C find . ! -name '*2013*'
Pola nama file Ksh cukup:
# files with 2013
ls -d -- *2013*
# files without 2013
ls -d -- !(*2013*)
Jika shell Anda adalah bash, Anda harus menjalankannya shopt -s extglob
sebelum 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, ls
mungkin bukan perintah yang tepat untuk digunakan. Untuk menyimpannya dalam sebuah array
filenames=( !(*2013*) )
for f in "${filenames[@]}"; do ...; done
Temukan semua file di direktori saat ini yang tidak mengandung string tertentu, di sini "2013":
find . ! -name "*2013*" -type f
ls
akan mengembalikan pesan kesalahan jika pola tidak cocok dengan file apa pun). Perhatikan juga bahwaksh
akan mengurutkan daftar.