Linux'ta gizli (nokta ile başlayan) dosyalar ve alt dizinler nasıl kopyalanır?


10

A klasöründeki gizli dosyalar ve gizli alt dizinler (nokta ile başlayanlar) B klasörüne nasıl kopyalanır? Örneğin bu yapıya sahipsem:

A/a
A/b
A/.a
A/.b/
A/.b/somefile
A/.b/.c

B sadece A gizli dosyaları ve gizli alt dizinleri kopyalamak istiyorum:

B/.a
B/.b/
B/.b/somefile
B/.b/.c

Zaten bu komutu denedim: cp A/.* Bden bu diğer süper soruya . Ancak, alt dizinleri kopyalamaz. Ayrıca denedim cp -r A/.* B, ama kopyalar .böylece A (normal dosyalar dahil) tam bir kopyasıyla biter. Herhangi bir yardım takdir.

Yanıtlar:


16

Yalnızca A düzeyinde gizli dosya ve klasörleri aradığınız ve istemediğiniz sürece, örneğin

A/b/.hidden

kopyalanabilmesi için bunu kullanabilmeniz gerekir:

cp -r A/.[^.]* B

Temel olarak, .ve ardından .filtrelenen .ve..

Düzenleme: Asker, sahipliklerini, tarihlerini vb. Korumak istediğini belirtmediğinden, -p'yi cp komutundan kaldırdı.


Bu , soruda verilen örnek dosya ve dizin adları için çalışır , ancak sorunun metni “gizli dosyalar ve gizli alt dizinler (nokta ile başlayanlar)” der ve bu yanıt adları ile başlayan dosyaları ve dizinleri bulamaz iki nokta; ör ..c.
Scott

Bu oldukça önemli bir durum, ama meşru bir endişe bile yok. Ben bunu düşünmemiştim. Buna geçerek bunu hesaba katabilirsiniz, .*[^.]ancak a ile biten dosyaları kaçırırsınız .. Gerçekten tüm davaları gerçekten açıklamak için genişletilmiş globbing gerektiğini düşünüyorum.
Omnipresence

4

Sorun A/.*dizini olmasıdır .içinde Ade desen eşleşir.

Genişletilmiş glob kalıplarını açabilir ve aşağıdakileri kullanabilirsiniz:

shopt -s extglob
cp -r A/.!(?(.)) B    

Adı bir nokta ile başlayan ve ikinci karakteri ne bir nokta ne de hiçbir şey (? (.) Hiçbir şey veya bir nokta ile eşleşmeyen dosyalar ile eşleşir!! ... hiçbir şeyden veya noktadan daha fazla).


Doğru cevap için +1. Not .!(@(|.))yalnızca uzun bir karakter biraz daha net yukarıdaki (IMNSHO) ila (AFAICT) eşdeğerdir ve.
Scott

3

Bunun gibi durumlar için findbunun yerine kullanılması önerilir cp:

find A/ -type f -maxdepth 1 -name '.*' -exec cp -p {} B/ \;

Temel sözdizimi şu şekilde parçalanır:

  • find A/ -type f: finddizinde A/türü bir dosya olan (dizin yerine) öğeler …
  • -maxdepth 1 -name '.*': Buna maxdepth1 namedizinden biriyle başlayan ve ile başlayan ..
  • -exec cp -p {} B/ \;: Ve bu dosyalar bulunur kez bir komut bayrak tarihleri korumak için / kaynaktan (den kez bir hedefe) .execcp-p{}B/

maxdepthBir kontrol katmanı eklemek için kullanmayı seviyorum , bu yüzden yanlışlıkla tüm dosya sistemini kopyalamıyorum. Ama bunu kaldırmaktan çekinmeyin.


0
 for item in `find A -type d | grep -E "\."` ; do cp -r $item B ; done
  • find A -type d A içinde yalnızca dizinlerle özyinelemeli bir liste sağlar
  • grep -E "\." dizinleri nokta ile filtreler (ör: gizli dizinler)
  • Burada -E seçeneğine ihtiyaç vardı, çünkü o olmadan da "geçerli dizin"
  • ters eğik çizgi, regexp altında, "herhangi bir karakterin" anlamından kaçınmaktır
  • cp -r özyineli olarak kopyalamak

A için dosya ve klasör yapısını oluşturdum ve Git Bash (şu anda bir linux ile değilim) komutunu çalıştırdım ve çalıştı.


Dosyaların adlarında veya yollarında boşluk veya özel karakterler varsa bu durum bozulur.
slhck

Fark ettiğiniz için teşekkürler :) Aslında @gaboroncancio tarafından "test çantası" ile sınırlı. Bana başka bir test pili verebilirseniz, bunu geliştirmeye çalışabilirim (elbette isterseniz, bu yanıtı düzenleyerek veya yeni bir cevap oluşturarak kendiniz geliştirebilirsiniz)
Malarres

Dotfiles'ı adlı bir klasöre koyabilirsiniz A Bve daha sonra genişleyeceği için beklenmedik bir şekilde hareket eder cp -r A B/.dotfile B. Genel tavsiye, ayrıştırmak findya da lsçıktı almak değildir . Kullanıyorsanız find, filtreleme için kendi seçeneklerini de kullanmanız gerekir grepve findçıktıyı başka bir yere yönlendirirseniz, -print0istediğiniz komutu kullanın veya doğrudan arayın. find El kitabına bakın .
slhck

Daha da genel olarak, dosyalarla çalışırken diğer yanıtlarda açıklandığı gibi kabuk globları kullanmak en güvenlidir (genellikle extglobayarlanmaları gerekir).
slhck

Bağlantı için teşekkürler. Şimdi findayrışmayı bırakalım .
Malarres

0

Alternatif olarak, ikinci karakter alfasayısal ( kaynak ) ise bu diğer komutu kullanabilirsiniz :

cp -r A/.[a-zA-Z0-9]* B

Bu , soruda verilen örnek dosya ve dizin adları için çalışır , ancak sorunun metni “gizli dosyalar ve gizli alt dizinler (nokta ile başlayanlar)” der ve bu yanıt adları ile başlayan dosyaları ve dizinleri bulamaz bir nokta ve özel bir karakter; örneğin, .@fooveya ..c.
Scott

Bu yüzden, ikinci karakter alfasayısal ise işe yaradığını belirtiyorum. ;)
gaboroncancio
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.