Dosyaları bulun ve kopyalayın


128

Aşağıdakiler dosyaları neden hedef klasöre kopyalamıyor?

# find /home/shantanu/processed/ -name '*2011*.xml' -exec cp /home/shantanu/tosend {} \;

cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'
cp: omitting directory `/home/shantanu/tosend'

Yanıtlar:


273

Amacınız bulunan dosyaları / home / shantanu / tosend içine kopyalamaksa, cp'nin tersine çevrilmesi için argümanların sırasına sahipsiniz:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp "{}" /home/shantanu/tosend  \;

Not: bul komutu , eşleşen dosya için yer tutucu olarak {} kullanın


14
Amacı nedir \;?
Astrid

5
@Astrid kontrol et
shellbye

find -iname '*.mp3' -mtime -1 -exec cp {} /home/my_path/ \;bu komutta yanlış bir şey var mı? çalışmıyor
mrid

2
Sonuçların yolda bir boşluk varsa çalışmaz. Bunun için herhangi bir öneriniz var mı?
TheJeff

1
Ubuntu 18'de küme parantezlerinin de tek tırnak içine alınması gerekir: -iname '* .mp3' -mtime -1 -exec cp '{}' / home / my_path / \;
p6majo

32

bunun gibi bir sorunla karşılaştım ...

Aslında iki şekilde size işleyebilir findkomut çıktısını copykomutu

  1. Eğer finddosya adı içinde boşluk içermiyorsa komutun çıktısı herhangi uzay ie içermiyor o zaman aşağıda belirtilen komutunu kullanabilirsiniz:

    Sözdizimi: find <Path> <Conditions> | xargs cp -t <copy file path>

    Misal: find -mtime -1 -type f | xargs cp -t inner/

  2. Ancak üretim veri dosyalarımız çoğu zaman içinde alan içerebilir. Dolayısıyla, aşağıda belirtilen komut çoğu zaman daha güvenlidir:

    Sözdizimi: find <path> <condition> -exec cp '{}' <copy path> \;

    Misal find -mtime -1 -type f -exec cp '{}' inner/ \;

İkinci örnekte, son kısım yani noktalı virgül de findkomutun bir parçası olarak kabul edilir ve enter düğmesine basmadan önce kaçılması gereken komuttur. Aksi takdirde böyle bir hata alırsınız

find: missing argument to `-exec'

Sizin durumunuzda, bul dosyasını içine kopyalamak için kopyalama komutu sözdizimi yanlış/home/shantanu/tosend . Aşağıdaki komut çalışacaktır:

find /home/shantanu/processed/ -name '*2011*.xml' -exec cp  {} /home/shantanu/tosend \;

3. GNU find/ xargs, varsa find <Path> <Conditions> -print0 | xargs -0 -r cp -t <copy file path>. Örnek:find -mtime -1 -type f -print0 | xargs -r0 cp -t inner/
Toby Speight

7

cp -t /home/shantanu/tosendArgümanın bir kaynak değil, hedef dizin olduğunu söylemek için kullanmanız gerekir . Daha sonra değiştirebilirsiniz -exec ... +almak için cptek seferde mümkün olduğunca çok sayıda dosya olarak kopyalamak için.


2
Linux'ta hedef dizini şu şekilde belirtmek zorundaydı: find /home/shantanu/processed/ -name '*2011*.xml' -exec cp --target-directory=/home/shantanu/tosend {} \;
GuruM

3
Komple komut en üst cevaptaki gibi sağlanmışsa, bu cevap geliştirilebilir ve kısaltılabilir.
Brian


-2

Bu hatanın nedeni, -r seçeneği gerektiren bir klasörü kopyalamaya çalışıyor olmanızdır.


3
Merhaba, soru zaten cevaplandığından (bir süre önce) bu gerçekten alakalı bir cevap değil, aynı zamanda bir yorum olmalı (biraz daha temsilciniz olduğunda), eğer onu genişletmek ve açıklamak istemiyorsanız. Sadece aklınızda bulunsun :).
W1ll1amvl
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.