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ı?
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:
Bash kullanıyorsanız ve extglob
kabuk seçeneği ayarlandıysa (genellikle durum budur):
mv ~/Linux/Old/!(Tux.png) ~/Linux/New/
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
İ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.
mv !(arc*) archive_190629b
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 1
o içermez yapar ~/Linux/Old
sonucu 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 -t
seç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 \;
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
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
grep -v
Orada neden kullandığınızı açıklayabilir misiniz ?
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
-l
seç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.
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.
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.
ls ~/Linux/Old/ | grep -v Tux.png | xargs -i {} mv ~/Linux/New/'
ls ~/Linux/Old/ | grep -v Tux.png | xargs -I{} mv {} ~/Linux/New/
yerine çalışır.
Grep şöyle atlanabilir :
ls ~/Linux/Old/ -QI Tux.png | xargs -I{} mv ~/Linux/Old/{} ~/Linux/New/
Bu daha basit ve hatırlanması kolay olabilir ve benim için işe yarar.
mv $(ls ~/folder | grep -v ~/folder/exclude.png) ~/destination