Daftar pengecualian mv baris perintah


11

Apakah ada cara untuk mv,, cpatau operasi file apa pun sehingga saya dapat menentukan semua file yang saya tidak ingin terpengaruh?

Misalnya, saya memiliki folder dengan file file1, file2dan file3, dan saya ingin pindah file1dan file2di suatu tempat. Daripada secara eksplisit memberi nama file untuk dipindahkan ( mv file1 file2 /path/to/destination), saya ingin memberi nama file untuk tidak dipindahkan dan semua yang lain di folder dipindahkan ( mv --some-switch file3 /path/to/destination)


Saya percaya bahwa mv file1 file2 /path/to/destinationtidak akan melakukan apa yang Anda inginkan
phunehehe

Jawaban:


19
  • Anda dapat menggunakan pola globbing lanjutan di beberapa shell untuk mencocokkan semua file dalam direktori kecuali untuk mereka yang cocok dengan pola tertentu. Misalnya, dalam ksh, bash atau zsh, perintah

    shopt -s extglob   ## needed in bash only
    setopt ksh_glob   ## needed in zsh only
    mv /source/!(*.bak) /destination
    

    akan memindahkan semua file /sourceke /destinationkecuali untuk file yang cocok *.bak. Di zsh, Anda juga dapat menulis /source/^*.bakjika Anda pertama kali menjalankan setopt extended_glob, dan lebih umum (lagi-lagi membutuhkan setopt extended_glob) /source/*~*.bak(atau /source/a*~*.bakuntuk semua file yang namanya dimulai akecuali untuk .bakfile, dll).

  • Zsh memiliki perintah penyalinan / pemindahan / tautan massal yang dapat digunakan, antara lain, untuk memindahkan semua file kecuali untuk yang cocok dengan suatu pola. Misalnya, perintah berikut memindahkan semua file kecuali *.bakdari /sourceke target, dan menambahkan .baknama mereka dalam proses:

    autoload zmv
    zmv '/source/(*)~*.bak' '/target/$1.bak'
    
  • Ada beberapa perintah yang disebut renamemelayang. Di Debian dan Ubuntu, /usr/bin/renameadalah skrip perl yang memindahkan file ke nama baru yang dihasilkan oleh ekspresi perl. Anda dapat mengecualikan file dari penggantian nama dengan tidak menghasilkan nama baru jika file tersebut akan dikecualikan. Misalnya, perintah berikut (menggunakan renameprogram khusus ini) memindahkan semua file kecuali *.bakdari /sourceke /target:

    rename 's!/source!/target! unless m!\.bak$!' /source/*
    
  • Anda dapat menggunakan findperintah untuk memilih file yang ingin Anda pindahkan. Sebagai contoh, perintah berikut memindahkan semua file biasa kecuali *.bakdalam /sourceatau subdirektori ke /target(perhatikan bahwa struktur direktori diciutkan):

    find /source -type f \! -name '*.bak' -exec mv {} /target/ \;
    

    atau (lebih efisien jika ada banyak file untuk dipindahkan)

    find /source -type f \! -name '*.bak' -exec sh -c 'mv "$@" "$0"' /target/ {} +
    
  • rsyncadalah generalisasi dari cpdan scpdengan aturan termasuk / tidak termasuk yang sangat kuat. Sebagai contoh, perintah berikut menyalin semua file kecuali *.bakdalam /sourceatau subdirektori ke /target, dengan menghormati struktur direktori:

    rsync -a --exclude '*.bak' /source/ /target/
    
  • paxadalah (antara lain) cpsteroid. Aturan pengecualiannya tidak sekuat rsync, tetapi memiliki kemampuan tambahan untuk mengganti nama file saat disalin. Jika Anda mengganti nama file menjadi string kosong, itu dikecualikan dari salinan. Sebagai contoh, perintah berikut menyalin semua file kecuali *.bakdalam /sourceatau subdirektori ke /target, dan mengganti nama file menjadi .baklewat.

    cd /source && pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' . /target/
    

    Contoh di atas memiliki efek samping yang tidak diinginkan dalam membuat direktori yang disebut foo.bak, yang dapat dihindari dengan menggabungkan finddengan pax:

    { cd /source && find . -type f; } | \
    pax -rw -pp -s '/.*\.bak$//' -s '/$/.bak/' /target/
    

Luar biasa. Satu kemungkinan koreksi: Saya pikir findperintah itu harus diakhiri\;
Steven D

@ Seven: Terima kasih, saya terus lupa Anda hanya dapat menggunakan +segera berikut {}.
Gilles 'SO- stop being evil'

daftar yang bagus, terima kasih. :-)
echox

1
jawaban apa, jempol besar :)
Dzung Nguyen
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.