Linux'ta tüm dosyalar geçerli dizinden üst dizine nasıl taşınır?
Bir şey denedim mv *.*
ama işe yaramadı.
Linux'ta tüm dosyalar geçerli dizinden üst dizine nasıl taşınır?
Bir şey denedim mv *.*
ama işe yaramadı.
Yanıtlar:
Aradığınız komut
mv * .[^.]* ..
veya (daha fazla bilgi için aşağıya bakınız):
(shopt -s dotglob; mv -- * ..)
Açıklama: mv
komut dosyaları ve dizinleri taşır. Son argüman mv
hedef (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
.
.[^.]*
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 shopt
dotfiles 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 shopt
gerekli ikinci bir çağrı yapılmaz ) ve --
bir çizgi ile başlayan dosyaların argüman olarak yorumlanmaması için kullanır mv
.
.*
, mv'nin hareket edememe konusunda uyarılar / hatalar üretmesine neden olabilir .
ve ..
. Bunun mv * .[^.]* ..
yerine deneyebilirsiniz .
*
, .[^.]*
ve ..?*
. İkincisi belki .[!.]*
daha eski (POSIX) mermiler için. Ayrıca okuyun
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 * .[^.] .??* ..
!
..?*
için geri döndüm , ve sen zaten bununla ilgilenmiştin.
mv
daha 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.
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
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.
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 rsync
iç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 mv
komuta benzer şekilde davranmasını sağlar .
--remove-source-files
(senkronize) dizinleri kaldırmaz.
-bash: /bin/mv: Argument list too long
hata veriyor . Bu çekicilik gibi çalışıyor.
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.
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 rm
değ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 bletch
olduğunu düşündüğünüz yer bletch
, ile daha kesin hale getirilebilir mv xyz bletch/.
.
.[^.]
kapak dosyaları almak için ekleyebilirsiniz .a
.
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:
\ diğer adların mv'yi istenmeyen şekilde değiştirmesini önler.
- Baştaki tire (-xyz) içeren dosya adlarının komut satırı argümanları olarak yorumlanmasını önler.
. [^.], ile başlayan iki karakter dosya adının hepsiyle eşleşir. dışında ..
. ?? *, diğer tüm dosya adlarını üç veya daha uzun karakterlerle eşleştirir.
Naive Uygulamaları:
Aşağıdakiler, başlayan UNIX dosya adlarını atlar. (Bashrc).
mv * ..
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 .* ..
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.
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> ..
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 -a
yazdı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 -a
Gizli dosyalar yoksa önlemek için en iyisidir ve yalnızca kullanın ls
.
mv $(ls -a)
mi? Bu, geçerli dizine ve altındaki dizine dokunur çünkü ls -a
aynı ..
zamanda çıkacaktır .
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.
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.
[linux] [mv] [cwd] [files]
veya benzer bir şey olabilir mi?