Kaynak dosya bulunmadığında 'cp' komutunun hata vermemesine nasıl izin verilir?


59

Mac OS X kullanıyorum. Bunun gibi bir derleme betiği için bazı dosyaları cp komutuyla kopyalamaya çalışıyorum.

cp ./src/*/*.h ./aaa

Ancak ./src dizininde .h dosyası yoksa bu komut bir hata verir. Komut hata yapmaz nasıl yapılır? (sessiz başarısızlık) Hata derleme sonucunun başarısız olmasına neden olur, ancak yalnızca bazı başlık dosyaları olduğunda kopyalamak istiyorum.

Yanıtlar:


69

Hata mesajından bahsediyorsanız, bunu bit kovasına göndererek bastırabilirsiniz:

cp ./src/*/*.h ./aaa 2>/dev/null

Çıkış kodunu ve hata mesajını gizlemek istiyorsanız:

cp ./src/*/*.h ./aaa 2>/dev/null || :

8
:Bu bağlamda ne anlama geldiğini açıklamak güzel olurdu .
Piotr Dobrogost

23
@PiotrDobrogost: Bash ve diğer bazı kabuklarda kolon boş bir yardımcı programdır (no-op). Bu oluyor Belirtilen tarafından POSIX'e . Her zaman doğru döndüğü için, başarısız bir çıkış kodunu bastırmak için burada kullanılır cp(arzu edilirse). Yerleşik kabuk trueyerine kullanılabilir ve daha okunaklı olur.
Dennis Williamson,


1
Bu aynı zamanda diğer hataları da görmezden gelecektir (kaynak / hedef dizini mevcut değil, kaynak dosyası var ancak okunabilir değil, disk dolu, salt okunur dosya sistemi, IO hatası, bir şekilde cpolmamak PATH...)
Vladimir Panteleev

beklenmedik token `|| 'yakınındaki sözdizimi hatası
Temmuz’dan

13

Çizgileri boyunca bir şey arıyorsun

if [ -e file ]
 then cp file /somewhere
fi

(Ne yazık ki, -fseçenek aradığınız droid değil.)

Eğer bir küreyi eşleştirmek istersen, bu işe yaramaz. kullanmak findyerine, örneğin:

find ./src -name \*.h -exec cp {} ./destination \;

Orada böyle bir yaklaşımla potansiyel TOCTOU sorunu olduğunu unutmayın (eğer kullanıyorsanız örn set -eve dosya arasında kaybolur [ve cpçağırmaları, sizin komut kilitlenmesine).
Vladimir Panteleev

9

Eski soru, ancak yine de başkaları için uygun olabilir. Cp kullanmanıza gerek
yoksa , rsync ile deneyebilirsiniz. Tüm dosyaları bir kaynaktan bir hedef dizine kopyalamak için, şunu çalıştırın:

rsync -avzh --ignore-errors /path/to/source /path/to/destination

Rsync, Linux, Mac OS X veya FreeBSD gibi çoğu Unix benzeri sistemle birlikte gelir.


4
Parametre ekleyerek cp yerine rsync kullanabilirsiniz --ignore-missing-args: rsync -av --ignore-missing-args ./src/*/*.h ./aaaBu, --ignore-errorsgöz ardı edilen tek hataların var olmayan kaynak dosyalarla ilgili olması avantajına sahiptir . İle --ignore-errorsher hata göz ardı edilir, tehlikeli olabilen. Ayrıca, bu parametrenin oldukça yeni olduğunu göz önünde bulundurun, bu nedenle rsync'nin eski sürümlerinde bulunmayabilir.
jesjimher

6

Sonucu true değerine getirmek, komutun her zaman başarılı olmasını sağlar. Bunu Linux'ta denedim, ancak herhangi bir Mac OS'de değil:

cp ./src/*/*.h ./aaa | true

5
Basit boru |her zaman ||sadece bir hata durumunda yapılırken çalıştırılır . Ve truekolon ise genellikle bir ikili olan :bir yerleşik olup bir PID tüketmez.
ott--

MacOS - Yosemite "cp ./src/*/*.h ./aaa" komutunu içeren bir bash betiği .h dosyaları yoksa hata vermez.
Vivek

2

Doğru hata durumunu zorlayabilirsin. Bir fonksiyonla:

$ cpalways () { cp $1 $2 2>/dev/null ; return 0 ; }

Aşağıdakiler göz önüne alındığında:

$ ls foo bar baz
ls: baz: No such file or directory
bar foo

Normal kopya bir hata döndürür. 1 çıkış durumunu döndürür.

$ cp baz bar ; echo $?
cp: baz: No such file or directory
1

Yukarıdaki cpalways () işlevini kullanırsak, herhangi bir hata gizlenecektir:

$ cpalways baz bar ; echo $?
0
$ cpalways foo bar ; echo $?
0
$ cpalways baz bar ; echo $?
0
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.