Dizin olmayan her dosyayı taşıma


14

Hem dosyaları hem de alt dizinleri içeren temizlemeye çalıştığım bir dizin var. Ne yapmaya çalışıyorum basit: başka bir dizine tüm dosyaları taşımak, ama oldukları gibi tüm alt dizinleri bırakın.

Şöyle bir şey düşünüyorum:

mv [*_but_no_dirs] ./other_directory

Bunu joker karakterler *ve regex ile yapmanın basit bir yolu olmalı gibi görünüyor ...

Fikirleri olan var mı?


1
Yani bir alt klasördeki tüm dosyaları taşıyın, ancak alt dizinlerdeki dosyaları yoksay?
Wilf

@Wilf: Kesinlikle.
Questionmark

2
Zsh'de yapabilirsiniz mv **/*(.) ./other_directory- bash ile findolsa da, harici komutlara başvurmanız gerekir .
godlygeek

Yanıtlar:


12

Regex burada yer almıyor. Bash içindeki joker karakterler (diğer kabukların çoğu gibi), dosya türüne veya diğer özelliklere göre değil, yalnızca dosya adlarına göre dosyaları eşleştirir. Türe göre eşleşmenin bir yolu vardır: /desenin sonuna eklemek , onu sadece dizinlerle veya dizinlere sembolik bağlantılarla eşleştirir. Bu şekilde, dizinleri taşıyabilir, sonra kalanları taşıyabilir ve dizinleri geri taşıyabilirsiniz - hantal ama işe yarıyor.

tmp=$(TMPDIR=.. mktemp -d)
mv -- */ "$tmp"
mv -- * "$tmp"/other_directory/
mv "$tmp"/* .
rmdir "$tmp"

Dosyaları türe göre eşleştirmenin standart bir yolu aramaktır find.

find . -name . -o -type d -prune -o -exec sh -c 'mv "$@" "$0"' other_directory/ {} +

Zsh'de, dosyaları türe göre eşleştirmek için glob niteleyicileri kullanabilirsiniz . .Niteleyici düzenli dosyaları eşleşir; kullanmak ^/veya olmayan tüm dizinleri maç için -^/de dizinlere sembolik bağlantılarını verme.

mv -- *(.) other_directory/

Herhangi bir kabukta, basitçe döngü yapabilirsiniz.

for x in *; do
   if ! [ -d "$x" ]; then
     mv -- "$x" other_directory/
   fi
done

8

Gibi bir şey kullanabilirsiniz

find . -maxdepth 1 \( ! -type d \) -exec sh -c 'mv  "$@" MYDIR' _ {} \;

İlk önce findsadece mevcut dizinin içine bakmak için kullanırız, sonra ! -type d nihayet shher şeyi yürütüp hedef dizine taşıyarak dizinleri görmezden geliriz . {} +Sonunda daha hızlı deneyebilirsiniz .


2
Biraz açıklama, lütfen ...
Questionmark

1
@ Soru Soruyu güncelledim ve bir açıklama ekledim. Ayrıca, ziyaret etmeye
Valentin Bajrami

Neden -exec sh -c 'mv "$@" MYDIR' _ {} \;daha çok öneriyorsun -exec mv {} MYDIR \;? Sadece bir değiştirerek akıcı bir şey elde \;etmek için +? Bunu -exec mv -t MYDIR {} +form ile yapabilirsiniz .
Scott

@Scott -tBayrak hakkında hiçbir fikrim yoktu . Cevapta +daha hızlı olduğunu, ancak tüm findsürümlerin desteklemediğini de açıkladım. Yani yukarıdaki kod findkullanılan herhangi bir veya kabuk ile hemen hemen uyumludur .
Valentin Bajrami

1
@ val0x00ff: “… yukarıdaki kod findkullanılan herhangi bir veya kabukla hemen hemen uyumlu .” Doğru, ama öyle find … -exec mv {} MYDIR \;, ve bu daha az kaynak kullanıyor … -exec sh -c 'mv "$@" MYDIR' _ {} \;.
Scott

0

Potansiyel olarak biraz tehlikeli ama

cp * destination/
rm *

Hem cp hem de rm dizinlerde -r anahtarı olmadan çalışmaz.


-1

Sadece mv *.* destination/hedef ile yapmak / taşınmakta olduğunuz klasör olmak öneririz .



2
Dizin adları 'nokta' içerebilir ve dosya adları bunu dışlayabilir (ve genellikle de yapar), bu nedenle *.*bazı dizinleri taşıyacak ve bazı dosyalar bırakacaktır, bu da askerin istediği şey değildir.
dave_thompson_085

Üzgünüm ama bu tamamen yanlış. Sadece adında bir nokta olan herhangi bir şeyi hareket ettirecek ve bir şey olmadan hareket etmeyecektir. Noktalar hiçbir şekilde dosyalara özel değildir ve dosyalar tarafından da gerekli değildir, bu nedenle bu sadece rastgele bir dosya ve dizin seçimini taşır.
terdon

-2
mv $(ls -l | grep "^-" | awk '{print $9}') ./folder_where_move
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.