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

100

Ev dizinimi eski bir sistemden yeni bir sisteme taşıyorum ve yaptığım tarball .bashrc gibi gizli dosyalar da dahil olmak üzere her şeyi içeriyor. Bununla birlikte, paketlenmemiş tarball'un içeriğini (/ tmp dizinindedir) yeni giriş dizinine taşıdığımda, gizli dosyalar kopyalanmaz ( mv /tmp/home/rcook/* /home/rcook/ ). Onları taşımak için nasıl mv alabilirim?

Aslında, sorunun mv ile değil, baskın globbing ile olduğunu düşünüyorum. 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/.foo taşınmadı. Peki gizli dosyaları bulmak için * joker karakterini nasıl alabilirim?

Evet, sanırım tarlayı doğrudan ev dizinime açabilirim, ancak tarball home/rcook/... 'sında açılır ve eski, özelleştirilmiş sürümleri ile yeni .bashrc ' nin üzerine yazdığımdan emin olmak isterim. ve gizli dosyaları nasıl bulacağınızı ve taşıyacağınızı bilmek değerli bir beceridir. Öneriler?

Bazı yanıtlar, mv src/.* dest/ gibi bir şey yapılmasını önermektedir. Ancak, bunu test dizinlerimde denedim ve hatalar aldım. İle başlayarak:

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?

    
sordu Randall Cook 21.02.2013 20:14

7 cevap

113

Bunu yapabilirsiniz:

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

koyabilirsiniz

shopt -s dotglob
Varsayılan olmasını istiyorsanız,

% co_de değerinizde.

Bkz. İşte

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

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

~/.bashrc desenini ..* (üst dizine işaretçi) ile eşleştiğinden kullanmayın. Adı iki nokta ile başlayan dosyalar varsa ( .. ), ayrıca ..something desenini kullanın.

    
verilen cevap Gilles Quenot 21.02.2013 20:16
23

Eklemelerinizde hatalar var, ancak kod hala çalışıyor. Eklenecek tek şey, nokta dosyalarını kopyalamak için sadece olduğunu söylediniz. Deneyin:

mv src/* src/.* dst/

Bunun için hala hataları alacaksınız. ve .. girdileri, hangi iyi. Ama 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
    
verilen cevap Andrew Schwartz 03.01.2014 19:47
10

Bir dizinde ls -l koyarsanız, listelenen dosyalar arasında . ve .. değerini görürsünüz. Bu yüzden, mv .* /dest bu işaretçileri dikkate alır. Deneyin:

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

Bu, geçerli ve üst yönetmenleri yok sayar.

* , [^.]* veya ..?* öğesinin herhangi bir dosyayla eşleşmemesi durumunda bir hata alırsınız. Bu nedenle, yalnızca eşleşenleri içermelisiniz.

    
verilen cevap Azamat 14.06.2014 14:20
5

Düşünebileceğim iki olası çözüm. Birincisi, tekrar eden seçeneği ile cp yerine, geçerli dizini hedefe kopyalamaktır.

cp -Rp . /desired/directory

sonra kaynak dosyaları geçerli dizinde kaldırabilirsiniz

Alternatif olarak, dosyaların isminin ismini aldığını biliyorsanız (boşluk, joker, yazdırılamaz karakterler), bunun gibi bir şey yapabilirsiniz

mv $(ls -A) /desired/directory
    
verilen cevap Drake Clarris 21.02.2013 23:03
2

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

Dosyaları bir glob ile bile kopyalamak için, dosyayı . % gibi co_de% ile öneki, ardından mv -u .* foo öğesi de taşınırken .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, foo/.foo ve . 'nin özel dosyalar oldukları ve taşınamadıkları ile ilgili hataları görmezden gelebilirsiniz, ancak kabuk tarafından .. glob'e yakalanırsınız.

    
verilen cevap dobey 21.02.2013 20:17
0

Yani elimizde:

a
|-- .foo
'-- bar

ve

b

Buradaki tüm yanıtlardan daha iyi bir çözüm bulmaya devasa zaman aldım.

Sonra bu komut için 30 saniye aldım:

$ mv --help

Sonra aşkımı buldum:

$ mv a/ b/ -T

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

  

-T, --no-target-directory DEST'i normal bir dosya olarak ele al

    
verilen cevap user433901 28.07.2015 02:42
-1

Gizli dosyalar da dahil olmak üzere dosyaları bulunduğunuz dizine kopyalamak isterseniz.

cp -Rp source-directory/. .
    
verilen cevap Rick 05.09.2016 02:51

Etiketlerdeki diğer soruları oku