Gizli dosyaları taşımak için mv'yi (veya * joker karakterini) nasıl kullanabilirim?

Ev dizinimi eski bir sistemden yeni bir sisteme taşıyorum ve hazırladığım tarball .bashrc gibi gizli dosyalar da dahil olmak üzere her şeyi içeriyor. Ancak, paketinden çıkarılmış tarball içeriğini (/tmp içinde olan) yeni ev dizinime taşıdığımda, gizli dosyalar kopyalanmıyor (mv /tmp/home/rcook/* /home/rcook/). mv'nin onları taşımasını nasıl sağlayabilirim?

Aslında, bence sorun mv ile değil, bash'in globbing'i ile ilgili. Eğer bunu yaparsam:

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

Ben bunu görüyorum:

a/:
.  ..  .foo

b/:
.  ..  bar

a/.foo` taşınmadı. Peki * joker karakterinin gizli dosyaları bulmasını nasıl sağlayabilirim?

Evet, sanırım tarball'u doğrudan ev dizinime açabilirim, ancak tarball home/rcook/... dizinine açılıyor ve yeni .bashrc vb. dosyaların eski, özelleştirilmiş sürümlerinin üzerine yazdığımdan emin olmak istiyorum ve gizli dosyaları nasıl bulacağımı ve taşıyacağımı bilmek değerli bir beceridir. Öneriniz var mı?


Bazı cevaplar mv src/.* dest/ gibi bir şey yapmayı öneriyor. Ancak, bunu test dizinlerimde denedim ve hata 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?

Çözüm

Bunu yapabilirsin:

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

Koyabilirsin

shopt -s dotglob

Eğer varsayılan olmasını istiyorsanız ~/.bashrc dosyanıza ekleyin.

Bkz. http://mywiki.wooledge.org/glob


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

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

..kalıbını kullanmayın, çünkü..(üst dizine işaretçi) ile eşleşir. Adı iki nokta ile başlayan dosyalar varsa (..something),..?` kalıbını da kullanın.

Yorumlar (9)

Aklıma iki olası çözüm geliyor. Birincisi, cp'yi özyinelemeli seçeneği ile kullanmak ve mevcut dizini hedefe kopyalamak.

cp -Rp . /desired/directory

sonra geçerli dizindeki kaynak dosyaları kaldırabilirsiniz

Alternatif olarak, dosyaların mantıklı bir şekilde adlandırıldığını biliyorsanız (boşluk, joker karakter, yazdırılamayan karakterler yok), şöyle bir şey yapabilirsiniz

mv $(ls -A) /desired/directory
Yorumlar (1)

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

Dosyaları bir glob ile bile kopyalamak için, mv -u .* foo gibi dosyanın önüne . eklemeniz gerekir ve ardından .foo taşındığında foo/.foo olarak görünecektir.

u seçeneği yalnızca kaynak daha yeni olduğunda veya hedef eksik olduğunda dosyaları taşıyacaktır. Ya da . ve .. dosyalarının taşınması ile ilgili hataları görmezden gelebilirsiniz, çünkü bunlar özel dosyalardır ve taşınamazlar, ancak kabuk tarafından .* globuna yakalanırlar.

Yorumlar (1)