Biri hariç tüm dosyaları taşıma


155

Biri hariç tüm dosyaları nasıl taşıyabilirim? Gibi bir şey arıyorum:

'mv ~/Linux/Old/!Tux.png ~/Linux/New/'

eski şeyleri yeni şeylere taşıdım-hariç Tux.png. ! -sign bir olumsuzlamayı temsil eder. İş için bir araç var mı?

Yanıtlar:


142

Bash kullanıyorsanız ve extglobkabuk seçeneği ayarlandıysa (genellikle durum budur):

mv ~/Linux/Old/!(Tux.png) ~/Linux/New/

1
Komutu birçok öğe için test ettiğimde bir sorunum var: mv ~ / Linux / Old /! (Tux.png Tux1.png Tux2.png) ~ / Linux / New / Tüm Eski dizini boşaltır. Yanlış olan ne?
Léo Léopold Hertz 준영

5
@UnixBasics, şunu deneyin: ~ / Linux / Old /! (Tux.png | Tux1.png | Tux2.png)
Juliano

@Juliano Çok güzel bir komut! OR ve XOR gibi daha matematiksel işlemler var mı? Bir borunun AND için olduğunu varsayıyorum.
Léo Léopold Hertz 준영


@Juliano Mv ~ / Linux /? (Tux * .png) ~ / Linux / Yeni / mv ~ / Linux / + (Tux * .png) ~ / Linux / Yeni / Önceki gibi , 0-1 Tux -fotoğraf taşımak istedim. İkincisinde, 1-n Tux fotoğraflarını taşımak istedim. Her şeyi hareket ettirdiler. Neden? Belirli bir miktarda fotoğrafı taşımak mümkün mü?
Léo Léopold Hertz 준영

97

Aşağıdakileri .bashrc'nize koyun

shopt -s extglob

Normal ifadeleri uzatır. Daha sonra tek bir dosya dışındaki tüm dosyaları

mv !(fileOne) ~/path/newFolder

Diğer komutlarla ilgili istisnalar

İplik fark olarak, ileriye flaş adına kullanılamaz dizinleri kopyalama konusunda, unutmayın Neden extglob koşulu dışında kırma hariç? :

cp -r !(Backups.backupdb) /home/masi/Documents/

bu yüzden Backups.backupdb/burada olumsuzlamadan önce yanlıştır ve yanlış kullanma riski nedeniyle diğer dizinler ve olası diğer istisnalar nedeniyle onu hareketli dizinlerde kullanmazdım.


3
Bu aslında doğru cevap. Benimki yanlıştı; Neyse ki sadece birkaç dosya ile bir klasörde kullanmıştı. Masi'nin gösterdiği yöntem hakkında daha fazla bilgi: wiki.bash-hackers.org/syntax/pattern "Genişletilmiş kalıp dili" ne gidin ve bu konuda daha fazla bilgi bulacaksınız. Konuyu işaret ettiği için @ paul-whittaker'a teşekkürler.
mimoralea

Bu eski bir cevap ama yine de geçerli. Ubuntu 18 kullanıyorum ve extglob varsayılan olarak etkin görünüyor (vurmadım). Geçerli dizindeki tüm dosyaları, diğer arşiv klasörleri dahil DEĞİL, bu dizinde de bulunan bir arşive taşımak için aşağıdaki komutu kullandım: mv !(arc*) archive_190629b
TonyG

70

Geleneksel bulmak & xargs yolu ile gider:

find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png -print0 | 
    xargs -0 mv -t ~/Linux/New

-maxdepth 1özyinelemeli arama yapmaz. Yalnızca dosyaları önemsiyorsanız söyleyebilirsiniz -type f. -mindepth 1o içermez yapar ~/Linux/Oldsonucu içine yolunu kendisi. Katıştırılmış yeni satırlar içerenler de dahil olmak üzere tüm dosya adlarıyla çalışır.

Bir yorum, mv -tseçeneğinin muhtemelen bir GNU uzantısı olduğunu belirtiyor . Sahip olmayan sistemler için

find ~/Linux/Old -maxdepth 1 -mindepth 1 -not -name Tux.png \
    -exec mv '{}' ~/Linux/New \;

1
Güçlü bir araç öğrenmeyi teşvik ettiğinden beri oylandı. Boşluklu dosyalar için bu çalışmaz. "Find -print0 | xargs -0" deyin veya xargs'den vazgeç: "find [ne dedin] -exec mv -t {} ~ / Linux / New \;"
05:55

Mv komutunuzda -t seçeneği yoksa "find ... -exec mv {} Linux / New \;" veya "bul ... | xargs -I {} mv {} Linux / Yeni". -T seçeneği, Linux için uygun ancak muhtemelen başka yerde olmayan bir GNU uzantısı gibi görünüyor.
Rob Kennedy

jhs, oh başarısız olur. bir şekilde xargs'ın yeni satırlara bölündüğünü düşündüm ama boşluklarda değil. Ben "okumak" ile karışık gibi görünüyor :) kötü düzeltme
Johannes Schaub - litb

Müthiş ipucu için çok teşekkürler! Soruyu hedeflediği için sth'yi seçecektim. Ancak, komutlarınızın yararlılığını daha sonra anlayabilirim, bu yüzden "bul ve xargs" yolunu seçmeliyim. Sadece sallanıyor. Teşekkürler :)
Léo Léopold Hertz 준영

Karmaşık bir yol. Masi yanıtı daha eksiksiz, daha kolay ve daha doğru
user637338

30

Hızlı bir yol, taşıma komutunuzun eşleşmemesi için smokin dosya adını değiştirmek olacaktır.

Örneğin:

mv Tux.png .Tux.png

mv * ~/somefolder

mv .Tux.png Tux.png

kullanmayın " ", bu sadece sahip dosyaları hareket edecek şekilde "" adında. Sadece "*" yeterlidir.
Juliano

1
* Olarak değiştirirseniz, yeniden adlandırılan dosyanızı da siler.
John T

6
@John T: Hayır, * glob nokta ile başlayan dosyalarla eşleşmiyor.
Bill Karwin

Bu en iyi cevap. Bu cevabı değiştirmeye veya yorumlamaya gerek yok. 100 puan. Çok teşekkürler. Aferin!
Steve K

23

Bence en kolay yol backticks ile

mv `ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/

Düzenle:

Takma adla kullanılmasını önlemek için bunun yerine ls ile ters eğik çizgi kullanın, yani çoğunlukla ls - color olarak adlandırılır.

mv `\ls -1 ~/Linux/Old/ | grep -v Tux.png` ~/Linux/New/

Teşekkürler @Arnold Roa


1
grep -vOrada neden kullandığınızı açıklayabilir misiniz ?
Léo Léopold Hertz 준영

1
-rep seçeneği grep sonucu hariç tutar, Tux.png hariç her şeyi almak gibi
Rohail Abbas

1
Bu kesinlikle sezgiseldir, ancak yukarıdaki cevaplar daha iyidir. Örneğin, bir senaryo yazıyorsanız, bu doğru dizinde olmanızı gerektirir ..
nJGL

@nJGL Burada da mutlak yol verebiliriz, soru olduğu için homedirectory (~) kullandım
Rohail Abbas

@RohailAbbas Yeterince adil. ✌️
nJGL

14

Bash için sth cevabı doğrudur. İşte zsh (benim seçim kabuğum ) sözdizimi:

mv ~/Linux/Old/^Tux.png ~/Linux/New/

EXTENDED_GLOBKabuk seçeneğinin ayarlanmasını gerektirir .


3
İki dosyayı hariç tutmak istiyorsak ne olur?
mpen

13

Bu, belirli dosyaları veya dizinleri hariç tutan basit hareketler için biraz daha güvenli ve güvenilmesi daha kolay olduğunu düşünüyorum.

ls -1 | grep -v ^$EXCLUDE | xargs -I{} mv {} $TARGET

Bu Busybox / ASH için en iyi çözüm
Stuart Cardall

1
Bu, birkaç klasör dışındaki tüm dosyaları başka bir dizine taşımak zorunda kaldığım durumda işe yaradı
Umar Hayat

Bu -lseçenek ls, komut satırında çok sayıda alakasız bilgi içerecek ve mv komutunun başarısız olmasına neden olacaktır.
jdhao

5

Aşağıdakiler% 100 garantili bir yöntem değildir ve kodlama için hiç denenmemelidir. Ancak bazen hızlı etkileşimli kabuk kullanımı için yeterince iyidir. Gibi bir dosya dosyası glob

[abc]*

(tüm dosyaları a, b veya c ile başlayan adlarla eşleştirecek) önce bir "^" karakteri eklenerek kaldırılabilir, yani

[^abc]*

Bazen örneğin "kayıp + bulunan" dizini ile eşleşmediğinde, örneğin:

mv /mnt/usbdisk/[^l]* /home/user/stuff/.

Tabii ki l ile başlayan başka dosyalar varsa, bunları daha sonra işlemek zorundayım.


4
mv `find Linux/Old '!' -type d | fgrep -v Tux.png` Linux/New

Find komutu tüm normal dosyaları listeler ve fgrep komutu Tux.png dosyalarını filtreler. Backticks mv'ye sonuçta oluşan dosya listesini taşımasını söyler.


4
Asla, asla, bulmayı başka bir komut için argüman olarak değerlendirmeyin. Kötü şeyler olacak. Bir güvenlik açığı oluşturmuş olabilirsiniz. Her zaman find -print0 | xargs -0 yapı veya -exec'i bul.
Juliano

3

Klasördeki her şeyi taşımaya ve sonra Tux.png'yi geri taşımaya ne dersiniz?

Kabuk sözdizimini "hariç her şey ..." demeden düşünemiyorum.


3
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'

1
Bu komutun bir kısmı eksik gibi görünüyor ve bilgisayarımda çalışmıyor. ls ~/Linux/Old/ | grep -v Tux.png | xargs -I{} mv {} ~/Linux/New/yerine çalışır.
Katherine Chen

3

Nasıl olur:

mv $(echo * | sed s:Tux.png::g) ~/Linux/New/

Yine de klasörde olmalısınız.


3

Grep şöyle atlanabilir :

ls ~/Linux/Old/ -QI Tux.png | xargs -I{} mv ~/Linux/Old/{} ~/Linux/New/

1

Bu daha basit ve hatırlanması kolay olabilir ve benim için işe yarar.

mv $(ls ~/folder | grep -v ~/folder/exclude.png) ~/destination

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.