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.