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?
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.
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
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.