Komut satırı mv hariç tutma listesi


11

Bir yolu var mı mv, cpya da ben tüm dosyaları belirtebilirsiniz öyle ki herhangi bir dosya işlemi yok etkilenir misin?

Örneğin, ben dosyaları ile bir klasör var ki file1, file2ve file3, ve ben taşımak istiyorum file1ve file2bir yere. Aksine açıkça (taşımak için dosyaları adlandırma daha mv file1 file2 /path/to/destination), dosyaları adlandırmak istiyorum değil (taşımak ve hareket olsun klasördeki tüm diğerlerini olması mv --some-switch file3 /path/to/destination)


Ben mv file1 file2 /path/to/destinationbunu yapmak istediğini yapmayacağım inanıyorum
phunehehe

Yanıtlar:


19
  • Belirli bir desenle eşleşenler dışındaki bir dizindeki tüm dosyaları eşleştirmek için bazı kabuklardaki gelişmiş globbing desenlerini kullanabilirsiniz. Örneğin, ksh, bash veya zsh'de, komut

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

    tüm dosyaları hareket edecek /sourceiçin /destinationdosyaları eşleme için hariç *.bak. Zsh'de, /source/^*.bakilk çalıştırdığınızda setopt extended_globve daha genel olarak (tekrar gerektiren setopt extended_glob) /source/*~*.bak(veya /source/a*~*.bakadı dosyalar ahariç .bak, vb. İle başlayan tüm dosyalar için ) yazabilirsiniz .

  • Zsh, bir kalıpla eşleşenler dışındaki tüm dosyaları taşımak için diğerlerinin yanı sıra kullanılabilecek bir toplu kopyalama / taşıma / bağlantı komutuna sahiptir. Örneğin, aşağıdaki komutu dışındaki tüm dosyaları taşır *.bakgelen /sourceetmek targetve ekler .baksüreçte Adlarının:

    autoload zmv
    zmv '/source/(*)~*.bak' '/target/$1.bak'
    
  • Etrafta renameyüzen denilen birkaç komut vardır . Debian ve Ubuntu'da, /usr/bin/renamedosyaları perl ifadesi tarafından oluşturulan yeni bir ada taşıyan bir perl betiğidir. Dosya hariç tutulacaksa, yeni bir ad oluşturmayarak dosyaları yeniden adlandırma işleminin dışında tutabilirsiniz. Örneğin, aşağıdaki komutu (bu özel kullanarak renameprogramı) dışındaki tüm dosyaları taşır *.bakgelen /sourceiçin /target:

    rename 's!/source!/target! unless m!\.bak$!' /source/*
    
  • findTaşımak istediğiniz dosyaları seçmek için komutu kullanabilirsiniz . Örneğin, aşağıdaki komutu dışındaki tüm düzenli dosyaları taşır *.bakiçinde /sourcebir alt dizin veya /target(dizin yapısı çökmüş olduğunu not):

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

    veya (taşınacak çok sayıda dosya varsa daha verimli)

    find /source -type f \! -name '*.bak' -exec sh -c 'mv "$@" "$0"' /target/ {} +
    
  • rsyncbir genellemedir cpve scpçok güçlü / şunlardır kuralları hariç ile. Örneğin, aşağıdaki komut dizin yapısına bağlı *.bakolarak /sourceveya alt dizin dışındaki tüm dosyaları içine kopyalar /target:

    rsync -a --exclude '*.bak' /source/ /target/
    
  • pax(diğer şeylerin yanı sıra) cpsteroidlerde başka bir şeydir . Dışlama kuralları neredeyse rsync'ler kadar güçlü değildir, ancak kopyalandıkça dosyaları yeniden adlandırma özelliğine sahiptir. Bir dosyayı boş dizeye yeniden adlandırırsanız, dosya kopyadan çıkarılır. Örneğin, haricinde, aşağıdaki komutu kopyalar tüm dosyaları *.bakiçinde /sourceveya içine bir alt dizin /targetve dosyaları yeniden adlandırır .bakgeçerken.

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

    Yukarıdaki örnek foo.bak, şu şekilde bir araya getirilerek önlenebilecek dizinler oluşturmanın talihsiz yan etkisine findsahiptir pax:

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

Muhteşem. Olası bir düzeltme: findKomutun bitmesi gerektiğini düşünüyorum\;
Steven D

@Steven: Teşekkürler, sadece +hemen ardından kullanabileceğinizi unutmaya devam ediyorum {}.
Gilles 'SO- kötü olmayı bırak'

güzel bir liste, bunun için teşekkürler. :-)
echox

1
ne bir cevap, büyük başparmak yukarıya :)
Dzung Nguyen
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.