Nokta ile başlayan isimli dosyayı nasıl kopyalarım?


26

A dizini altındaki tüm dosyaları B dizinine kopyalamaya çalışıyorum. A dizini altındaki tüm dosyalar nokta ile başlıyor, örneğin:

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

kullandıysam buldum: cp A/* Bdaima hata alırım:

cp: cannot stat 'A/*': no such file or directory

Hiçbir seçeneği yoktur görünüyor cpolarak lsherkes nasıl düzeltilir fikri vardır, nokta ile başlayan koluna girdileri?

Yanıtlar:


34

Bunun nedeni, içinde bash, *dot ( .) ile başlayan dosyaları içermemesidir .

Koşabilirsin

cp A/.* B

O kopya etmediği sizi uyaracaktır .veya ..tüm alt ya ama bu iyi.

Veya nokta dosyalarını ve normal dosyaları birlikte kopyalamak istiyorsanız,

cp A/.* A/* B

Ayrıca koşabilirsin

shopt -s dotglob
cp A/* B

hangi işe yarayacak bash, ama değil sh.

Ve alt dizinlerin de kopyalanmasına aldırış etmiyorsanız, bu en kolay yoldur:

cp -R A/ B

İpucu: Joker karakterler beklediğiniz şeyi yapmıyorsa, örneğin echo ile çalıştırmayı deneyin.

$ echo A/*
A/file1 A/file2

$ echo A/.*
A/. A/.. A/.hidden1 A/.hidden2

$ echo A/.* A/*
A/. A/.. A/.hidden1 A/.hidden2 A/file1 A/file2

$ shopt -s dotglob
$ echo A/*
A/file1 A/file2 A/.hidden1 A/.hidden2

Bu sadece kullanırsanız sorun olur -r. Olmadan -r, sadece dizinleri atlayacaktır.
Mikel

Ve kullandığım örnek -Rde gayet iyi çalışmalı. Yanlış olduğunu düşünüyorsanız, lütfen nedenini açıklayın.
Mikel

7

Bash ise, dotglobkopyalamadan önce ayarlayabilirsiniz.

shopt -s dotglob
cp A/* /destination

Veya bir programlama dili

$ ruby -rfileutils -e  'Dir[".*"].each {|x| FileUtils.copy(x,"/destination") if File.file?x}'

Dotglob ayarlamak istemiyorsanız, sadece

cp A/.* /destination 2>/dev/null

Dotglob OP kullanarak, gizli olmayan dosyaları da kopyalar, ki istediği bu değildir.
peoro

@peoro, soruyu tekrar okumalısın. İçindeki tüm dosyalar Agizlidir. Sadece bunu kopyalamak istiyor.

7

Aradığın şey daha çok şey boyunca:

cp A/.??* B/

Bu, tüm nokta dosyalarıyla eşleşecek, ancak "." veya "..". Özyinelemeli olarak çalışmadığınız sürece yukarıdaki çözümlerin çoğu iyi. Ama şöyle bir şey yapmak istersen:

cp -R A/.??* B/

".." ihmal etmeden, nokta dosyaları olmayanlar da dahil olmak üzere üst dizindeki her şeyi kopyalarsınız.


1
Bu, .aveya gibi tek bir karakter olan nokta dosyalarını özleyecektir .x. En kısa globbing kalıbını maçlar dışında her nokta dosyası bulduk .ve ..bir .[^.]*.
pavon

2

Sadece şunu denedim ve işe yarıyor ...

cp A/.* B/

2
Bu aynı zamanda geçecektir A/.ve OP'nin dizinleri de kopyalaması gerektiğinde sorunlu olabilecek A/..parametreler olarak cp(kullanarak cp -r)
peoro

2

Bu değil cp'ın hatası bash genişlediğinde:' s bash, *tüm olmayan gizli (yani: olmayan bir başlangıç .) dosyaları.

Bash .*(bu A/.*durumda sizin durumunuzda) ile başlayan tüm dosyaları genişletecek ., ancak ne yazık ki, muhtemelen atlamak isteyeceğiniz .ve ..(geçerli ve üst dizinleri) de içeriyor . (Zsh gibi diğer mermilerin bunları içermediğine ve bazı seçenekleri ayarladıktan sonra IIRC'nin de bash olduğuna dikkat edin).

Basit bir çözüm kaldır bağlı olabilir .ve ..eşleşmesi dosyalarından .*böyle bir (çok) hacky şekilde:

cp $( for F in A/.*; do echo $F | grep -v "^\.*$"; done ) B

veya bu (muhtemelen temizleyici: findkopyalanacak dosyaları bulmak için kullanılır):

cp $( find A -maxdepth 1 -mindepth 1 -name ".*" ) B

ancak muhtemelen daha temiz çözümler bulacaksınız.


neden bir iş kullanıp for loopsonra grepsadece böyle bir iş yapmak için fazladan bir süreç oluşturmalısınız cp A/.*? cp"." ve ".." dizinleri.

1

Hepsi bir nokta ile başlarsa, sadece kullanın A/.*:

[holt@Michaela test]$ cp A/* B
cp: cannot stat `A/*': No such file or directory

[holt@Michaela test]$ cp A/.* B
cp: omitting directory `A/.'
cp: omitting directory `A/..'
[holt@Michaela test]$ ls -al B
total 8
drwxrwxr-x. 2 holt holt 4096 2011-03-31 16:57 .
drwxrwxr-x. 4 holt holt 4096 2011-03-31 16:57 ..
-rw-rw-r--. 1 holt holt    0 2011-03-31 16:57 .a
-rw-rw-r--. 1 holt holt    0 2011-03-31 16:57 .b
-rw-rw-r--. 1 holt holt    0 2011-03-31 16:57 .c

Bu yardımcı olur umarım!


1

Bu betiği kullanabilirsiniz

IFS = $ '\ n'; $ cinsinden hareket için (A -d 1'i bulun); cp -R "$ hareket" B; tamam


0

copy:

cp A/.* B

liste:

ls -l A/.*

azalan dizinleri olmayan dosyaları listele:

ls -ld A/.*

0

Dışlamanız gerekir. ve .. dosya listesinden cp'ye geçildi!

Bu güvenlidir:

ls -1d A/.[a-zA-Z]* | xargs -i cp -rp {} B

0

Bu eski bir konu ... ama her zaman tüm dosyaları kopyalayabildim. '.' İle başlayan dosya / klasörleri içerir.

Örnek, tüm dosya ve klasörleri kopyalayacaktır:

cp -aup /root/.* / backup / root /

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.