Tüm dosyalar geçerli dizinden üst dizine nasıl taşınır?


133

Linux'ta tüm dosyalar geçerli dizinden üst dizine nasıl taşınır?

Bir şey denedim mv *.*ama işe yaramadı.


Soruları yeniden etiketlemek için yeterli desteğim yok, ancak önerebilir miyim [linux] [mv] [cwd] [files]veya benzer bir şey olabilir mi?
Stephan202

Stephan202'nin isteği doğrultusunda bu soruyu yeniden etiketledim.
eleven81

Yanıtlar:


202

Aradığınız komut

mv * .[^.]* ..

veya (daha fazla bilgi için aşağıya bakınız):

(shopt -s dotglob; mv -- * ..)

Açıklama: mvkomut dosyaları ve dizinleri taşır. Son argüman mvhedef (bu durumda ağaçta bir adım "yukarı" dizini ..). Bundan önceki argümanlar kaynak dosyalar ve dizinlerdir. Yıldız ( *), nokta ile başlamayan tüm dosyalarla eşleşen bir jokerdir. Bir nokta ile başlayan dosyalar (nokta dosyaları) "gizlidir". Desen kullanılarak eşleştirilirler .[^.]*(aşağıdaki düzenlemeye bakın).

Daha fazla bilgi için bağladığım kılavuz sayfasına bakın mv.


Neden .[^.]*yerine .*?

Chris Johnsen'in doğru bir şekilde gösterdiği gibi : desen .*aynı zamanda .ve ... Bunları taşımak istemediğiniz (ve edemediğiniz) için, bu ikisi dışında bir nokta ile başlayan herhangi bir dosya adıyla eşleşen bir kalıp kullanmak daha iyidir . Desen .[^.]*yok sadece: herhangi bir dosya adı (1) olan bir karakter ve ardından bir nokta (2) ile başlayan maçları değil bir nokta (3) sıfır veya daha fazla keyfi karakterle devam.

Paggas'ın işaret ettiği gibi .??*, iki noktadan başlayan dosyaları eşleştirmek için deseni de eklememiz gerekir . Kullanarak alternatif bir çözüm için verdiği cevaba bakınız find.

Arjan en cevabı bahseder shoptdotfiles ile tüm bu sorunları önlemek amacıyla. Ama sonra hala bir tire ile başlayan dosyalarda sorun var. Ve üç komut gerektirir. Yine de bu fikri sevdim. Bunu bu şekilde kullanmayı öneriyorum:

(shopt -s dotglob; mv -- * ..)

Bu shopt, bir alt kabukta yürütülür (bu nedenle shoptgerekli ikinci bir çağrı yapılmaz ) ve --bir çizgi ile başlayan dosyaların argüman olarak yorumlanmaması için kullanır mv.


7
Kullanmak .*, mv'nin hareket edememe konusunda uyarılar / hatalar üretmesine neden olabilir .ve ... Bunun mv * .[^.]* ..yerine deneyebilirsiniz .
Chris Johnsen

1
@ lalain: rica ederim ve siteye hoş geldiniz! (Buradaki gönderilerden biri (ve eğer varsa) sorunuzu yeterince cevapladıysa, o şekilde işaretleyebilirsiniz. Poster 15 fazla itibar puanı kazandıracak ve ayrıca size 2 rep fazla vereceğim.)
Stephan202

Gerçekten bir alt kabukta çalışan shopt çözümünü seviyorum :)
Paggas

2
*. * Sözdiziminde hiçbir zararı yoktur - dahil .. sadece chmod ve chown ile kullanıldığında ve "yinelenen" bayrağıyla, yani chmod -R veya chown -R ile kullanıldığında tehlikelidir. Ve bu durumlarda, asla chown yazmayın. * Veya chmod. * - aradığınız yoldaki üst dizini chown ve kullanın -h (sembolik bağlantıları takip etmeyin). Ama, mv .. sadece hiçbir şey yapmaz bu yüzden endişelenmeyin.
chris

1
Doğru üç desenler vardır *, .[^.]*ve ..?*. İkincisi belki .[!.]*daha eski (POSIX) mermiler için. Ayrıca okuyun

42

Kısa cevap: kullanın

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

Uzun cevap:

Komuta

mv * .* ..

ve .*eşleşebileceğinden beri çalışmayacak . Fakat emir...

mv * .[^.]* ..

aynı zamanda çalışmayacak, çünkü .[^.]*eşleşmeyecek, örneğin ..filename! Bunun yerine, yaptığım şey

mv * .[^.] .??* ..

.ve dışındaki her şeyle eşleşecek ... *Bir ile başlamaz her şeyi maç olacak ., .[^.]ancak bir nokta ile başlayan tüm 2 karakter dosya maç olacak ..ve .??*en az 3 karakterli bir nokta ile başlayan tüm dosya adlarını eşleşir.

Daha iyisi, kullanabilirsiniz

find . -mindepth 1 -maxdepth 1 -exec mv -t.. -- {} +

hangi çirkin glob hack önler mv * .[^.] .??* ..!


1
Ayrıca, komutun önemine dikkat etmeyi de unuttum - böylece komut bir çizgi ile başlayan dosya isimleriyle doğru şekilde çalışıyor. Ben dahil ettik - cevabımı bul ama. Globları kullanarak daha eksiksiz bir cevap "mv - *. [^.]. ?? * .." dır.
Paggas

+1: Yorumuma eklemek ..?*için geri döndüm , ve sen zaten bununla ilgilenmiştin.
Chris Johnsen

1
Mv .. çalışırken ne yanlış olabilir? Sadece hiçbir şey yapmaz ve hiçbir şey yapamaz. Bir şey yapabileceği başka komutlar da var (chmod ve chown) ama mv ve rm basitçe hiçbir şey yapmıyor. veya ..
chris

1
Bu mv verir: yasadışı seçenek - t
pal4life

1
Bono, çift çizgi mvdaha fazla komut seçeneği aramayı bırakmayı söyler . Parantezler ortaya çıkan bir dosya adıdır. Artı işareti, sonuç başına exec (yani dosya adı başına) çalıştırmak yerine, olabildiğince tek bir çalıştırmada çok fazla sonuç verdiğini söylüyor. Tamamlanması için, -t..tüm bu dosyaların taşınması için hedef hedefi taşımasını söylüyor.
izuldeki

14

Sadece tamlık uğruna, Bash kabuğuna aşağıdakileri kullanarak gizli dosyaları eklemesini söyleyebilirsiniz shopt:

shopt -s dotglob
mv -- * ..
shopt -u dotglob

+1. Çok daha temiz. Yine de küçük bir iyileşme olduğunu düşünüyorum. Cevabımın güncellemesine bakın.
Stephan202

8

Mv kullanırken gizli dosyaları taşıma işlevi yoktur *- öyleyse neden kopya kullanmıyorsunuz?

cp -rf . ..

rm -rf *

Dotglobbing ve find komutlarını kullanarak karmaşık çözümlere girmenize gerek yok.


Uyarı Aynı dosya sisteminde ilerliyorsanız , vakaların en büyük kısmında dosyaları gerçekten kopyalamamış ancak yalnızca inode veya dosya içeriklerini taşımadan dizin girişlerini güncellemişsinizdir. Bakınız [1 ] bile . A cpve rmbunun yerine gerçekten hepsini kopyalıyorsunuz.
Hastur

6
rsync -a --remove-source-files . ..

rsync Genellikle etkili artımlı uzaktan yedeklemeler ve aynalar gerçekleştirmek için kullanılan son derece güçlü bir dosya kopyalama aracıdır.

Yukarıdaki komutla ile, anlatıyorsun rsynciçeriğini kopyalamak için .INTO..

Anahtar alt dizinlere -aözyinelemeye .ve bazı diğer ortak seçeneklere olanak sağlar.

Anahtar --remove-source-files, rsync'e kaynak dosyaları başarılı bir kopyadan sonra çıkarmasını söyler, yani rsync'in mvkomuta benzer şekilde davranmasını sağlar .


1
Biraz daha açıklama güzel olurdu.
ChrisF

Tabii, umarım şimdi daha açıktır.
mrucci

Not --remove-source-files(senkronize) dizinleri kaldırmaz.
Dennis,

Güzel, kabul edilen bir çözüm bana -bash: /bin/mv: Argument list too longhata veriyor . Bu çekicilik gibi çalışıyor.
userlond

2

Sonunda denemek mv .başarısız olur, çünkü mv, içinde bulunduğunuz dizinin bağlantısını kaldıramaz mv * ... Dosyaları cwd içinde taşıyabilirsiniz.


2
mv * .??* ../.

*tüm nokta olmayan dosyaları alır. .??*hepsini alır. Tüm okunanlar için en az üç bayt uzunluğunda dosyalar. Kalan bir şey, muhtemelen yine de rmdeğil yapmak istersiniz mv.

Bu ../.doğrudan bir fayda sağlamaz, ..ancak dizine geçme işlemi yaparken, içine girmek çok iyi bir alışkanlıktır, çünkü yolunda yanlış bir şey varsa, istediğiniz gibi başarısız olacaktır. Örneğin , bir dizin mv xyz bletcholduğunu düşündüğünüz yer bletch , ile daha kesin hale getirilebilir mv xyz bletch/..


2
Gibi .[^.]kapak dosyaları almak için ekleyebilirsiniz .a.
Chris Johnsen

../ ve ../ arasında bir fark yoktur. bu yüzden yazmaktan rahatsız olmazdım. eğik çizgiden sonra. Ayrıca, mv ve rm durumunda, içerilmesi zarar vermez. ve .. listede, yani mv *. * / path / to / file / ile olduğu gibi korkutucu veya yanlış bir şey yoktur. veya hatta -rf. hiçbir şey yapmaz.
chris

2

Bu simge durumuna küçültülmüş komut çoğu modern kabukta çalışır:

\mv -- {,.{[^.],??}}* ..

Aksi takdirde belirtilen taşınabilir bir çözümdür:

\mv -- * .[^.] .??* ..

Özellikleri:

  1. \ diğer adların mv'yi istenmeyen şekilde değiştirmesini önler.

  2. - Baştaki tire (-xyz) içeren dosya adlarının komut satırı argümanları olarak yorumlanmasını önler.

  3. . [^.], ile başlayan iki karakter dosya adının hepsiyle eşleşir. dışında ..

  4. . ?? *, diğer tüm dosya adlarını üç veya daha uzun karakterlerle eşleştirir.

Naive Uygulamaları:

  1. Aşağıdakiler, başlayan UNIX dosya adlarını atlar. (Bashrc).

    mv * ..
    
  2. Aşağıdaki eşleşmeler .. tekrarlı bir şekilde her bir dizini sonunda geçerli çalışma dizininin başına ($ PWD veya pwd) geri / sonuna doğru hareket etmeye çalışır. Asla kullanma.

    mv .* ..
    

2

Bu desen kullanmak daha doğru olduğunu * .[!.] .??*daha * .[^.] .??*önceki ayrıca ksh88 gibi eski kabukları ile birlikte çalışacaktır başlangıcı:

mv -- * .[!.] .??* ..
  • -- ile başlayan bir dosya adınız olduğunda sorunları önler -
  • * ile başlamayan tüm dosya adlarıyla eşleşir. .
  • .taşıyabileceğiniz / hareket etmesi gereken bir karakter dosyası adı yok
  • .[!.] ile başlayan iki karakter dosya adının hepsiyle eşleşir. .
  • .??* ile başlayan üç karakter dosya adının hepsiyle (veya daha uzun) eşleşir. .

Ksh88 ile, dosya adı modeli .[^.]aslında dosya adlarıyla eşleşir ..(her zaman var olan) ve .^(muhtemelen yoktur), istenenin tersi bir etkiye sahiptir.


0

Bul ve grep de iş. Bu tür bir yapı, find ve egrep komutunu değiştirerek daha karmaşık ölçütlerdeki dosyaları seçmek isterseniz faydalı olabilir.

find -maxdepth 1 | egrep '^./.'         # Returns all files

mv `find -maxdepth 1 | egrep '^./.'` .. # mv <all files> ..

0

Tüm dosyaları ana dizinine taşımak için en kolay çözüm olduğunu düşünüyorum. olabilir

mv "`ls`" ../

veya, Gizli dosyalar / dizinler varsa

kullanın:

mv "`ls -a`" ../ 2>/dev/null

Ayrıca, bir klasörün içeriğini kendi içindeki bir klasöre taşımak istediğinizi varsayalım (diyelim)

kullanın:

mv "`ls -a`" /tony 2>/dev/null

Not:

"`ls -a`" 

İçinde boşluk olan dosyaları taşımak için.

2>/dev/null

Uyarı / hatayı bastırmak içindir, çünkü ve klasörünü de ls -ayazdırır .ve ..taşıyamaz veya kopyalayamazsınız. Bu yüzden, bu klasörler için (2> / dev / null kullanmazsak) onları taşıyamayacağı ve gerisi oldukça rahat bir şekilde taşınacağı hatası gösterecektir.

ls -aGizli dosyalar yoksa önlemek için en iyisidir ve yalnızca kullanın ls.


Koşarken ne olacağını denedin mv $(ls -a)mi? Bu, geçerli dizine ve altındaki dizine dokunur çünkü ls -aaynı ..zamanda çıkacaktır .
Sami Laine

Teşekkürler, @SamiLaine öneriniz için düzeltmeleri yaptım. Ancak mv ls -a ../ihtiyaca göre çalışabilirdi, Evet yukarıda belirttiğim gibi bu hataları gösterecek, ancak bunun dışında gerekli klasörleri / dosyaları ana dizine taşıyacaktır.
Prabhat Kumar Singh,

Bu boşluk içeren dosyalar için işe yaramaz.
kenorb '

@ kenorb ls, boşluklu dosyaları taşımak için komutu iki kez alıntılamanız gerekir . Gerekli değişiklikleri yaptım. Gösterdiğin için teşekkürler.
Prabhat Kumar Singh,
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.