Gizli dosyalar dahil tüm dosyalar * ile ana dizine nasıl taşınır


113

Popüler bir soru olmalı ama bir cevap bulamadım.

Gizli dosyalar da dahil olmak üzere tüm dosyalar * ile aşağıdaki gibi ana dizine nasıl taşınır:

mv /path/subfolder/* /path/

Bu, tüm dosyaları beklendiği gibi üst dizine taşır, ancak gizli dosyaları taşımaz. Bu nasıl yapılır?


1
bu sorunun SU'da bir kopyası var, daha da doğru bir yanıtı var (yine de kabul edilen cevap değil): cp -r /path/to/source/. /destination
Florian

Yanıtlar:


202

UNIX & Linux'un tüm dosyaları (gizli olanlar dahil) bir dizinden diğerine nasıl taşırsınız? Sorusuna verdiği yanıtta bununla ilgili kapsamlı bir çözüm seti bulabilirsiniz. . Bash, zsh, ksh93, standart (POSIX) sh, vb .'deki çözümleri gösterir.


Bu iki komutu birlikte kullanabilirsiniz:

mv /path/subfolder/* /path/   # your current approach
mv /path/subfolder/.* /path/  # this one for hidden files

Veya hep birlikte ( teşekkürler pfnuesel ):

mv /path/subfolder/{.,}* /path/

Hangi genişler:

mv /path/subfolder/* /path/subfolder/.* /path/

(örnek: echo a{.,}bgenişler a.b ab)

Bunun birkaç uyarı göstereceğini unutmayın:

mv: cannot move ‘/path/subfolder/.’ to /path/.’: Device or resource busy
mv: cannot remove /path/subfolder/..’: Is a directory

Bunları görmezden gelin: bu , aynı zamanda dizin ve üst dizin olan ve /path/subfolder/{.,}*uzantılarının da olmasından kaynaklanır (Bkz . "." Ve "..", bir klasörün içindeyken ne anlama geliyor? )./path/subfolder/./path/subfolder/..


Yalnızca kopyalamak istiyorsanız, yalnızca şunları kullanabilirsiniz:

cp -r /path/subfolder/. /path/
#                     ^
#                     note the dot!

Bu, hem normal hem de gizli olan tüm dosyaları kopyalayacaktır, çünkü /path/subfolder/."bu dizindeki her şey" olarak genişler (Kaynak: Gizli dosyaları ve gizli dizinleri ve içeriklerini dahil etmek için cp ile nasıl kopyalanır? )


2
Küme parantezleri sadece kısa bir mv /path/subfolder/* /path/subfolder/.* /path/yoldur, iki komutu tek bir komutta birleştirmek kesinlikle gerekli değildir.
chepner

7
Şu hatayı alıyorum:mv: overwrite `/path/.'? y mv: cannot move `/path/subfolder/.' to `/path/.': Device or resource busy mv: overwrite `/path/..'? y mv: cannot move `/path/subfolder/..' to `/path/..': Device or resource busy
Dejan

@Dejan Görmezden gelin. .geçerli dizini ve dizini ..belirtir up. Diğer tüm dosyaların taşındığını fark etmiş olmalısınız.
Debiprasad

Parantez kısayolunun tüm mermiler için çalışmayacağından bahsetmeye değer, ancak @chepner komutunun işe yarayacağını düşünüyorum
Jesús Carrera

7
"Uyarıyı görmezden gelin" her zaman iyi bir fikir olmayabilir. Şu anda, herhangi bir adım başarısız olursa yürütmeyi durdurmam gereken bir komut dosyasıyla ilgili bir sorun yaşıyorum - bu çözüm her zaman bir hataya neden olduğu için betiğimi öldürür. Mv komutunun başarısız olup olmadığını belirlemek için bir yola ihtiyacım var ...
MarioVilas

29

Bence bu en zarif, çünkü aynı zamanda hareket etmeye çalışmıyor ..:

mv /source/path/{.[!.],}* /destination/path

1
evet, bu hata mesajlarını da verdiğini fark ettim, güzel buldum.
Joseph Astrahan

Bunun çok iyi bir çözüm olduğunu düşünüyorum ama bu kalıbı hatırlamak biraz zor
Dylan B

Bu gibi dosyaları arayacağı ..anythingya ...anythingvs - stackoverflow.com/a/31438355/2351568 Bu sorunun doğru regex içerir. || ama yine de kullanmak shopt -s dotglobdaha iyi bir çözüm!
DJCrashdummy

@DylanB ezberleme. virgülle ayrılmış, süslü parantezlerin içindekilerle eşleştiğini unutmayın. {a,b}*"anatomi" ve "buldozer" gibi a veya b ile başlayan tüm dosyaları bulur. İkinci eşleşme sadece boş bir eşleşmedir *ve ilk eşleşme eşdeğerdir .[!.], burada grup [!.]a ile başlayan DEĞİL bir grup anlamına gelir .. Bu demek .*ama değil ..*.
mazunki

28

Bu, tüm dosyaları beklendiği gibi üst dizine taşır, ancak gizli dosyaları taşımaz. Bu nasıl yapılır?

Açabilirsiniz dotglob:

shopt -s dotglob               # This would cause mv below to match hidden files
mv /path/subfolder/* /path/

Kapatmak dotglobiçin şunu söylemeniz gerekir:

shopt -u dotglob

Çok yararlı. Daha fazlasını öğrenmek istedim ama shopt bir yerleşik olduğundan man shoptçalışmıyor ve help shoptçok kısa. Ama yapabilir bashman () { man bash | less -p "^ $1 "; }ve sonra bashman shopther şeyi doğrudan okuyabilirsiniz. (Bulduğum gibi, shopt ile başlayan satırlar varsa, komuta atlamak için n tuşuna basmak gerekebilir.)
Nick Rice

2
bu aynı zamanda diğer tüm komutları da etkileyecektir ls.. bu yüzden gerçekten istediğiniz şey değil, muhtemelen
phil294

5

Alternatif basit çözüm, rsyncyardımcı programı kullanmaktır :

sudo rsync -vuar --delete-after --dry-run path/subfolder/ path/

Not: Yukarıdaki komut neyin değiştirileceğini gösterecektir. Gerçek değişiklikleri uygulamak için kaldırın--dry-run .

Bunun avantajı, orijinal klasörün ( subfolder) komutun bir parçası olarak kaldırılması ve mvburada örnekleri kullanırken , gizli ve gizli olmayan dosyaları tek bir dosyada gizlemek için ek baş ağrılarından bahsetmek yerine, klasörlerinizi temizlemeniz gerekir. Desen.

Ek olarak rsync, dosyaların uzaktan kumandalar arasında kopyalanması / taşınması için destek sağlar ve dosyaların tam olarak orijinal oldukları gibi kopyalanmasını sağlar ( -a).

Kullanılan -uparametre, mevcut yeni dosyaları atlar, -rdizinlere tekrarlanır ve -vayrıntı düzeyini artırır.


Şimdiye kadarki en iyi çözüm! Benim durumumda -u parametresini kaldırdım çünkü kök klasörü güncellemek istemiyorum. Teşekkürler
Thales Ceolin

Bu, dikkatli olmazsanız, linux'ta işleri gerçekten kendiniz için kalıcı olarak bozabileceğiniz komutlardan biridir. Lütfen cevabınızı rsync komutundan önce sudo içerecek şekilde güncelleyin, aksi takdirde kullanıcılar mkdir için İzin Verilmedi'yi kolayca alabilir, ancak dosya silme işlemleri yine de devam eder, bu nedenle rsync komutu taşınmasını istediğiniz tüm dizini siler ve başka hiçbir şey yapmaz. . Tüm dizininizi kaybedeceksiniz. Cevabınıza sudo ekledikten sonra, bu muhtemelen kabul edilen cevap olmalıdır. Yani komut şu olmalıdır: sudo rsync -vuar --delete-after path / subfolder / path /
Blue Water

@JohnnyB Rahatsızlık için özür dilerim. Ekledim sudove --dry-runböylece herhangi bir potansiyel karışıklıktan kaçınmak için insanlar gerçek komutu çalıştırmadan önce değişiklikleri test edebilir.
kenorb

Oh, bir -dry-run seçeneği olduğunu fark etmemiştim. İyi bir ek. Özür dilemeye gerek yok. Bu mükemmel.
Blue Water

3

Seni arkadaşım "dotglob" ile tanıştırayım. "*" Gizli dosyalar içerip içermediğini açar ve kapatır.

$ mkdir test
$ cd test
$ touch a b c .hidden .hi .den
$ ls -a
. ..  .den  .hi .hidden a b c

$ shopt -u dotglob
$ ls *
a b c
$ for i in * ; do echo I found: $i ; done
I found: a
I found: b
I found: c

$ shopt -s dotglob
$ ls *
.den  .hi .hidden a b c
$ for i in * ; do echo I found: $i ; done
I found: .den
I found: .hi
I found: .hidden
I found: a
I found: b
I found: c

Varsayılan olarak "kapalı" dır.

$ shopt dotglob
dotglob         off

İşiniz bittiğinde tekrar açmak en iyisidir, aksi takdirde kapalı olacağını varsayan şeyleri karıştırırsınız.


3

findKomutu komutla birlikte kullanarak, komutun dizinleri (örn. Ve ) ve alt dizinleri taşımayı denemesini mvönleyebilirsiniz . İşte bir seçenek:mv...

find /path/subfolder -maxdepth 1 -type f -name '*' -exec mv -n {} /path \;

Verilen diğer cevapların bazılarında sorunlar var. Örneğin, aşağıdakilerin her biri, alt dizinleri kaynak yoldan taşımaya çalışacaktır:

1) mv /path/subfolder/* /path/ ; mv /path/subfolder/.* /path/
2) mv /path/subfolder/{.,}* /path/ 
3) mv /source/path/{.[!.],}* /destination/path

Ayrıca, 2). ve .. dosyalar ve 3) ..foobar, ... barfoo, vb. gibi dosyaları özlüyor.

mv /source/path/{.[!.],..?,}* /destination/path3) tarafından gözden kaçırılan dosyaları içeren, kullanabilirsiniz, ancak yine de alt dizinleri taşımaya çalışacaktır. Yukarıda anlattığım findkomutla birlikte komutu kullanmak mvtüm bu sorunları ortadan kaldırır.


2

Tüm dosyaları ( .dosyalar dahil ) izinleri koruyarak bir hedef dizine kopyalamam gerektiğinde bu soruna yönelik çözümüm şudur: (zaten varsa üzerine yaz)

yes | cp -rvp /source/directory /destination/directory/

yesotomatik olarak hedef dosyaların üzerine yazmak, rözyinelemeli, vayrıntılı, pizinleri korumak içindir.

Kaynak yolunun bir ile/ bitmediğine dikkat edin (bu nedenle tüm dosyalar / dizin ve. Dosyalar kopyalanır)

Hedef dizin/ , kaynak klasörün içeriğini bir bütün olarak hedefe yerleştirdiğimiz için ile biter .


yesHedef dosyaları geçersiz kılmak istiyorsanız kullanmak için harika bir komut olsa da, bu her zaman istenmez. Sadece bunu yapmak istediğinizden eminseniz kullanın. Ayrıca, yes | cp ...ve arasında bir fark var cp -f ...mı?
mazunki
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.