Gizli dosyaları taşımak için mv (veya * joker) nasıl alabilirim?


133

Giriş dizini eski bir sistemden yenisine geçiriyorum ve yaptığım tarball .bashrc gibi gizli dosyalar da dahil her şeyi içeriyor. Ancak, paketlenmemiş tarball içeriğini (/ tmp içinde) yeni giriş dizine taşıdığımda, gizli dosyalar kopyalamıyor ( mv /tmp/home/rcook/* /home/rcook/). Onları taşımak için mv nasıl alabilirim?

Aslında, bence sorun mv ile değil, bash küresiyle. Bunu yaparsam:

mkdir a
mkdir b
touch a/.foo
touch a/bar
mv a/* b/
ls -a a/ b/

Bunu görüyorum:

a/:
.  ..  .foo

b/:
.  ..  bar

a/.foohareket etmedi. Peki gizli dosyaları bulmak için * joker nasıl alabilirim?

Evet, sanırım tarball'u doğrudan ev dizinime açabilirim, ancak tarball sıkıştırır ve eski, özelleştirilmiş sürümlerle home/rcook/...yeni .bashrcvb. Üzerine yazdığımdan ve gizli dosyaları nasıl bulacağımı ve taşıyacağımı bildiğimden emin olmak istiyorum. değerli bir beceridir. Öneriler?


Bazı cevaplar böyle bir şey yapmayı öneriyor mv src/.* dest/. Ancak bunu test dizinlerimde denedim ve hatalar aldım. İle başlayan:

rcook$ ls -a a/ b/
a/:
.  ..  bar  .foo

b/:
.  ..
rcook$ mv a/.* b/
mv: cannot move 'a/.' to 'b/.': Device or resource busy
mv: cannot remove 'a/..': Is a directory
rcook$ ls -a a/ b/
a/:
.  ..  bar

b/:
.  ..  .foo

Neyi yanlış yapıyorum?


Yanıtlar:


146

Bunu yapabilirsiniz :

shopt -s dotglob
mv /tmp/home/rcook/* /home/rcook/

Koyabilirsin

shopt -s dotglob

Gözlerinde farklı ~/.bashrcbunu varsayılan olmasını istiyorsanız.

Http://mywiki.wooledge.org/glob adresine bakınız.


Nokta dosyalarını kopyalamak için başka bir yaklaşım:

mv /tmp/home/rcook/.[!.]* /home/rcook/

Deseni ..*eşleştiği gibi kullanmayın ..(üst dizine işaretçi). Adı iki nokta ( ..something) ile başlayan dosyalar varsa , deseni de kullanın ..?*.


Lütfen sorumun altına koyduğum ilavelere bakın. Teşekkürler.
Randall Cook,

1
Hiçbir şey yanlış .ve ..özel dir'ler: sırasıyla geçerli dir ve ebeveyn dir . Bu sadece bir uyarı. Daha iyi kullanım shopt -s dotglobçözümü
Gilles Quenot

Sadece iki hamle yaparak bittim: mv home/rcook/* /home/rcook/onu takip ettim mv home/rcook/.* /home/rcook/. Hile yaptım, keşke bağlantıyı takip edip ilk önce dotglob modunu okumuş olsaydım. Bana bir adım kazandıracaktı. +1
Randall Cook,

Demek ki ikinci yaklaşım mutlak yolların kullanılmasını gerektiriyor?
franzlorenzon

3
Eğer kullanıyorsanız zsh, kullanabileceğiniz globbing eleme veya kabuk seçeneği . DGLOB_DOTS
mgalgs

43

Eklemelerde hata yaptın ama kod hala işe yaradı. Eklenecek tek şey, sadece nokta dosyalarını kopyalamanızı söylemeniz . Deneyin:

mv src/* src/.* dst/

Hala için hataları alırsınız. ve .. girişler, bu iyi. Ancak hareket başarılı olmalı.

~/scratch [andrew] $ mv from/* from/.* to/
mv: cannot move from/.’ to to/.’: Device or resource busy
mv: cannot remove from/..’: Is a directory
~/scratch [andrew] $ ls -a from/ to/
from/:
.  ..

to/:
.  ..  test  .test

1
İyi puanlar @AndrewSchwartz. Ben de bu yaklaşımı sevdim. Bence daha fazla tanınmayı hak ediyor.
Randall Cook,

@Drake Clarris'in cevabını biraz daha seviyorum, çünkü Amazon AWS CodeBuild üzerinde çalışıyorum ve sıfır olmayan kod aslında derlememin durmasına neden oldu. .hiddenSorunumu çözmek için açık bir şekilde sahip olduğum bir dosyayı taşımaktan vazgeçtim .
HeyWatchBu

Sıfır olmayan bir çıkış kodu bir sorunsa, örneğin ekleyerek onu kaldırabilirsiniz || :( ||yanlış / hatada aşağıdakileri uygulayın :, noop komutudur). Ancak bu, okunaklı hataları da engeller, örneğin, hedef klasör yok. Ben kullanarak daha zarif yol bulamıyorum mvdışlamak .ve ..girişleri. Cp üzerinden benim için büyük artı popo diske yeni dosyalar yazmıyor.
Andrew Schwartz

10

Eğer varsa ls -lbir dizindeki, göreceksiniz .ve ..listelenmiş dosyaları arasında. Yani, mv .* /destbu işaretçileri dikkate alır. Deneyin:

mv /tmp/home/rcook/{*,.[^.]*,..?*} /home/rcook/

bu, şu anki ve ana işaretçilerden yoksayılır.

Üç desen varsa bir hata alırsınız *, [^.]*ya da ..?*hiçbir dosyayı maçları, böylece örtüşen şablonları sadece içermelidir.


Güzel. Bu tarz bir kürecilik tarzı için benzer bir cevap burada: superuser.com/a/784046/144977 . Bunu gönderdiğiniz için teşekkür ederiz.
phyatt

7

Düşünebileceğim iki olası çözüm. Bunlardan ilki, geçerli dizini hedefe kopyalamak yerine, özyinelemeli seçeneği yerine cp kullanmaktır.

cp -Rp . /desired/directory

daha sonra kaynak dizini geçerli dizinde kaldırabilirsiniz.

Alternatif olarak, dosyaların adının açıkça adlandırıldığını biliyorsanız (boşluk, joker karakterler, yazdırılamayan karakterler), bunun gibi bir şey yapabilirsiniz.

mv $(ls -A) /desired/directory

4
Kopyala ve sonra kaldır, kaynak ve hedef aynı dosya sisteminde ise, taşıma işleminden çok farklıdır. En azından -pmeta verileri koruma seçeneğini ekleyin . Kullanmak lsson çare olmalı ve burada daha iyi, daha basit yollar var.
Gilles

2

Linux'ta "gizli" dosyalar diye bir şey yoktur. Nokta ile başlayan dosyalar, varsayılan olarak sadece dosya listelerinden gizlenir.

Hatta bir topak ile dosyaları kopyalamak için, dosyayı önüne eklemeniz gerekebilir .gibi mv -u .* foove sonra .fooolarak appearn edecektir foo/.footaşındığında.

-U seçeneği sadece kaynak yeni olduğunda veya hedef eksik olduğunda dosyaları taşıyacaktır. Ya da sadece taşınma .ile ilgili hataları görmezden gelebilirler ve ..özel dosyalar oldukları ve taşınamadıkları için, ancak .*kabuğun içinde göze çarpıyorlar.


Lütfen sorumun altına koyduğum ilavelere bakın. Teşekkürler.
Randall Cook,

0

Böylece sahibiz:

a
|-- .foo
`-- bar

ve:

b

Buradaki tüm cevaplardan daha iyi bir çözüm bulmak için çok zaman harcadım.

Sonra bu komut için 30 saniye sürdü :

$ mv --help

Sonra aşkımı buldum:

$ mv a/ b/ -T

Not: Argümanı bile anlamadım -T. Sadece ihtiyacım olanı yaptım. İşte diyor ki:

-T, --no-target-directory DEST'i normal bir dosya gibi görür


1
Eğik çizgileri atlarsan, ihtiyacın olmamalı -T. Her iki durumda da, esasen mv'ye, tüm dosyaları içeriden taşımak yerine dizinin kendisini taşımasını söylüyor.
thomasrutter

@thomasrutter, dizini değiştirerek yeniden adlandırmakla aynı şeyi yapmıyor mu?
Randall Cook,

3
Evet, eğer ana varış yeri aynı kalırsa, aslında sadece yeniden adlandırmaktır. Bununla birlikte, başvuruda bulunduğunuzda, muhtemelen dizin içindeki dosyaları verilen bir konuma taşımakla ilgili olan orijinal soruyu yanıtlamaya yardımcı olmaz .
thomasrutter

0

Benim durumumda sadece mvgizli bir dosyaya çalışıyordum ve çözüm buydu:

FILE=.myHiddenFile
mv "$FILE" dest/

açıklama

İlk başta deniyordum:

mv .myHiddenFile dest/

Ancak hatayı üretmeye devam etti:

mv: cannot stat '.myHiddenFile': No such file or directory

Bir ls -alkanıt olmasına rağmen dosyanın dest/var olduğunu ve var olduğunu.

Bunun nedeni, kabuğun "." Yorumunu yapması gibi görünüyor. dosya adında, bir değişkene taşıyarak yorumlamayı engeller. Bunu çözmenin başka yolları da olabilir ama bu bizim için yeterliydi.


-1

Gizli dosyalar içeren dosyaları, bulunduğunuz dizine kopyalamak istiyorsanız.

cp -Rp source-directory/. .

1
Bu Drake Clarris'in 2013'teki cevabına çok benziyor. Eklemek istediğiniz başka bir şey var mı?
Randall Cook,
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.