Gizli dosyaları yinelemeli olarak kopyalama - Linux


19

Bir dizindeki tüm gizli dosyaları özyinelemeli olarak başka bir dizine kopyalamanın kolay bir yolu var mı? Bir ev dizinindeki tüm ayar dosyalarını değil, normal dosyaları yedeklemek istiyorum. Denedim:

cp -R .* directory

ancak gizli olmayan tüm dosyaları da tanır .ve ..özyinelemeli olarak kopyalar. Cp'yi görmezden gelmenin bir yolu var mı .ve ..?


Arasında herhangi bir fark var mı -rve -R?
Chaminda Bandara

Yanıtlar:


15

Genel olarak dirs taşımak için benim favori:

tar cvf - . | (cd /dest/dir; tar xvf -)

hangi stdout geçerli dizini tars sonra stdin untarring önce ilk cd's hedef dizine bir alt kabuk boru. Basit, doğrudan, genişletilebilir - () öğesini ssh ile başka bir makineye değiştirdiğinizde ne olacağını düşünün. Veya sorunuzu cevaplamak için şunları yapabilirsiniz:

tar cvf - .* --exclude=\. --exclude=\.\. | (cd /dest/dir; tar xvf -)

1
Teşekkürler, hariç tutma seçeneği ihtiyacım olan şey. Bunu zaten başka bir şekilde yaptım, ancak ileride başvurmak için saklayacağım. Bu gerçekten esnek görünüyor (belki de daha yavaş olsa da).
Zifre

1
İyi tavsiye. Birkaç iyileştirmem var: 1) Kullanım cd /dest/dir && tar xvf -. &&Eğer hedef bir yazım hatası varsa kaynak dizinden üzerinde blatting sizi durduracak. 2) Katran vbayrağına yalnızca katran komutlarından birinde (veya hiçbirinde) ihtiyacınız yoktur.
Tom Shaw

Yeterince adil. Ben de işleri başka bir şekilde gruplandırdım: Uzak bir (cd /src/dir && tar cf - .) | tar xvf -
srcdir'i

17

Neredeyse her seferinde bu sadece şu şekilde çözülebilir:

cp -R .[a-zA-Z0-9]* directory

Bu karakterlerden biriyle başlamayan gizli bir dosyaya sahip olmak oldukça sıra dışı.

Diğer kalıp eşleşmeleri mevcuttur ( .??*, .[^.]*) - yorumlara bakın


Bu yalnızca.-Xyz değerini yoksayar. [] İçindeki öğeler yalnızca noktadan sonraki ilk karakterle eşleşir.
Hamish Downer

6
[^.] * her şeyi
yakalardı

1
... iki dönemle başlayanlar hariç.
falstro

@roe - bu da güzel bir versiyon
Alnitak

mish - evet, cevapta çok şey söyledim.
Alnitak,

11

Kullanabilirsin rsync.

rsync -a ./ /some/other/directory/

geçerli dizinin içeriğini kopyalar (nokta dosyaları dahil ancak dahil değil ..)


Basit ve gizli klasörlerde gizli dosyalar için de çalışır.
user59183

benim için bu, sağlanan çözümlerin daha az kafa karıştırıcı ve en etkili olanı
palerdot

Güzel çözüm. Ayrıca .gitdirs üzerinden kopyalamak için gerekli . -C eklemek bunu yapar ve böylece komut şöyle olur:rsync -aC ./ /some/other/directory/
theruss

10

Ben size yalvarıyorum, cpkomut satırında düz kabuk genişlemesinden uzaklaşın - kabuk genişlemesi her türlü ahem "ilginç" köşe vakalarına sahiptir. findBunun yerine kullanın.) Bunun yerine kullanın ( findutilspaketin yüklü olmaması durumunda pakette gelir - bu garip olurdu, tüm dağıtımlar varsayılan olarak yükler):

find -H /path/to/toplevel/dir/ -maxdepth 1 -name '.*' -a \( -type d -o -type f -o -type l \) -exec cp -a '{}' /path/to/destination/dir/ \;

Adım adım açıklama:

  • -Hfindsembolik bağlantıları takip etmemeye neden olur (verdiğiniz gerçek üst düzey dizin adı bir sembolik bağlantı olduğu sürece takip eder.)
  • /path/to/toplevel/dir/ Açıkçası, yedeklemek istediğiniz ayar dosyalarını ve dizinleri barındıran dizin yapmak yolu ile değiştirilmesi gerekiyor.
  • -maxdepth 1findadı bir nokta ile başlayan tüm dizinlere yinelemeli olarak inmeyi durdurur . Dinlemek için ihtiyacımız yok cp, bunu bizim için yapacağız, sadece bu seviyede isimlere ihtiyacımız var.
  • -name '.*'findnokta ile başlayan tüm isimleri istediğimizi söyler . Ortam değişkeni POSIXLY_CORRECTayarlanmışsa bu düzgün çalışmaz , ancak nadiren (eğer varsa) ayarlanır. Bu, şimdiye kadar belirlediğimiz ilk eşleşme koşulu.
  • a \( ....... \)bir ve parantez içinde daha karmaşık bir duruma ardından (Kullandığım ..... onun yerine, o en aşağıda açıklanmıştır.) aksi takdirde kabuk tarafından yorumlanır (yanlış) olacağım beri parantez kaçmak gerekir, dolayısıyla önlerindeki ters eğik çizgi,
  • -type d -o -type f -o -type lbunlar arasında veya arasında üç koşul vardır . -type ddizinlerle -type feşleşir, normal dosyalarla -type leşleşir ve sembollerle eşleşir. Ne istediğinizi seçebilirsiniz - örneğin, ayar dizinlerini yedeklemek istemiyorsanız, atlayın -type d(ve -ohemen arkasında).
  • -exec ..... \;findher eşleşmeyle karşılaşıldığında bir komut çalıştırmayı söyler . Komutun sonu, kabuk yorumundan kaçınmak için tekrar ters eğik çizgiyle kaçmamız gereken bir noktalı virgülle işaretlenir. Bu komut satırında, {}karşılaşılan eşleşmenin adının bitmesini istediğiniz yeri kullanmanız gerekir . Kabuklar da kıvırcık parantezleri yanlış yorumlayabileceğinden, onları olduğu gibi kesme işaretlerine yerleştirmelisiniz '{}'. Bu durumda yürütmek istediğimiz komut şöyledir cp -a '{}' /path/to/destination/dir/(-a, alt dizinlerde toplanan arşivleri, bağlantıları bağlantı olarak kopyalayan ve izinleri ve genişletilmiş öznitelikleri koruyan ve /path/to/destination/dir/açık olarak hedef dizinin adı olan arşiv anlamına gelir - değiştirin).

Yani, basit İngilizce'de, bu findkomut satırı şunu söylüyor:

/ Path / konumundan / toplevel / dir / konumunda başlayın. Herhangi bir alt dizine inmeyin. Adı bir nokta ile başlayan tüm dizinleri, dosyaları ve sembolik bağlantıları bulun. Bulduklarınızın her biri için, onu / path / to / destination / dir / doğayı, izinleri ve genişletilmiş öznitelikleri kopyalayın.


1
bul en yararlı şeydir.
Bay Parlak ve Yeni 宇 宇

1
Güzel cevap. -Exec'i tercih etsem de ... ';' Ters eğik
çizgiden

8

Ben her zaman kullandım. ?? * "." Almadan gizli dosyaları bulmak için ve "..". Yine de ".a" ya da başka bir şeyi kaçırabilir, ama bunlardan hiçbirine sahip değilim.


kesinlikle güzel ve temiz :) +1
falstro

Bazı ".a" s
Zifre

Seviyorum çünkü herhangi bir gizli karakter dosyanız olmadığını biliyorsanız, yazmak gerçekten hızlı.
Paul Tomblin

Bu en iyi cevap olmalı. En üste kaldırılmalıdır.
İbn Saeed

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.