Ben size yalvarıyorum, cp
komut satırında düz kabuk genişlemesinden uzaklaşın - kabuk genişlemesi her türlü ahem "ilginç" köşe vakalarına sahiptir. find
Bunun yerine kullanın.) Bunun yerine kullanın ( findutils
paketin 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:
-H
find
sembolik 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 1
find
adı 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 '.*'
find
nokta ile başlayan tüm isimleri istediğimizi söyler . Ortam değişkeni POSIXLY_CORRECT
ayarlanmış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 l
bunlar arasında veya arasında üç koşul vardır . -type d
dizinlerle -type f
eşleşir, normal dosyalarla -type l
eşleşir ve sembollerle eşleşir. Ne istediğinizi seçebilirsiniz - örneğin, ayar dizinlerini yedeklemek istemiyorsanız, atlayın -type d
(ve -o
hemen arkasında).
-exec ..... \;
find
her 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 find
komut 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.
-r
ve-R
?