-Exec ile ilgili eksik argüman nedir?


15

Aşağıdaki komutu kullanarak 30 günden eski bir dizini, dosyaları ve dizinleri silerim ve kimse dosyaları geri istemezse birkaç hafta sonra silebileceğim bir arşiv dizinine taşırım. Hedef dizin, kullanıcı adına göre alt dizinlere sahiptir, bu nedenle arşiv dizini de olacaktır.

Kullandığım komut bu:

find /path/to/directory/username/ -mtime +30 -exec mv "{}" /path/to/archive/username/ \;

Ask ubuntu ile ilgili bir soruyu cevaplamak için bunun değiştirilmiş bir versiyonunu önerdim, başka bir kullanıcı daha hızlı (ve daha doğru?) Olduğu \;için satır sonunu değiştirmek için kodu düzenledi +. Buraya bakın

Ancak, komut +bu şekilde kullandığım ancak gerçek komutta değilse bu şekilde kullanılır. Eğer denerseniz bir hata mesajı alıyorum:-execls -lh+

find: missing argument to '-exec'

Neden bu şekilde davrandığını veya doğru komutun ne olacağını anlamıyorum. Lütfen bir komut düzeltmesi göndermeyin, sadece bir öneriyi körü körüne takip etmek yerine anlamak istiyorum.


Bu cevaba mı atıfta bulunuyorsunuz ? Bu nedenini açıklayabilir
Wilf

Düzenlemenin hangi yanıta geldiğini göstermek için güncelledik. Sağladığınız bağlantının, beynimin başa çıkabileceği şekilde açıklayan başka bir bağlantısı var.
Arronical


Teşekkürler @souravc zekice döngüsel bir şekilde bu soru benim komut düzenleyen kullanıcı tarafından! Sonunda +aynı komuta birden fazla argüman sağlar, ama mvbununla baş edemiyorum!
Arronical

@Arronical mv can, benim cevabımı görmek ^^
chaos

Yanıtlar:


19

Bu yayındaki kullanıcı +, bir -execkomutun sonundaki işaretin daha hızlı olduğunu, ancak neden olmadığını söyleyebilir.

findKomutun aşağıdaki dosyaları döndürdüğünü varsayalım :

/path/to/file1
/path/to/file2
/path/to/file3

Normal -execcommand ( -exec command {} \;) her eşleşen dosya için bir kez çalışır. Örneğin:

find ... -exec mv {} /target/ \;

çalıştırır:

mv /path/to/file1 /target/
mv /path/to/file2 /target/
mv /path/to/file3 /target/

+Sign ( -exec command {} +) yöntemini kullanırsanız, komutun sonuna birden fazla eşleşen dosya eklenerek komut oluşturulur. Örneğin:

find ... -exec mv -t /target/ {} +

çalıştırır:

mv -t /target/ /path/to/file1 /path/to/file2 /path/to/file3

+Bayrağı doğru bir şekilde kullanmak için , işlenecek argümanın ortasında değil komutun sonunda olması gerekir. Bu yüzden findörneğinizde toplar missing argument to '-exec'; kapanışı özlüyor {}.


Hep birlikte kullanıldığında neden son arg olmasını find -execgerektirdiğini merak ettim . OP'nin komut satırı gibi yapıların çalışmasına izin vermek yerine, bu tasarım kararının neden verildiğini bilen var mı? {}+
Peter Cordes

11

Kullanıcı düzenlemelerini açıkladı ....

'+' exec'in sonlandırıcısı '\;'  bkz. /ubuntu/558817/what-is-the-difference-between-using-and-in-exec-command;  ve orijinal dosyadan bir yedekleme dosyası oluşturmak iyi bir fikirdir

... bu bağlantıyı kullanarak . Temelde birden fazla komut kullanmak yerine, tüm dosya adlarını bir komut örneğine gönderir, işleri hızlandırmak için. İşte buradan bir örnek :

Noktalı virgül ( find . -exec ls '{}' \;) ile -exec kullanıldığında ,

ls file1
ls file2
ls file3

Ancak ( find . -exec ls '{}' \+) yerine artı işareti kullanırsanız , tüm dosya adları tek bir komuta bağımsız değişken olarak iletilir:

ls file1 file2 file3

Kullanan mevcut diğer formları vardır ;ve +hem de (dan buraya :)

Bu nedenle find komutu için aşağıdaki örnek sözdizimine izin verilir:

find . -exec echo {} \;
find . -exec echo {} ';'
find . -exec echo {} ";"
find . -exec echo {} \+
find . -exec echo {} +

ANCAK, onun 'için sözdizimi olarak emin bu, hareket komutu oldu Neyse çalışacak değilim mv [OPTION]... SOURCE DESTsürece, -tkullanılan seçenek veya benzeri. Ancak ls, birden fazla dosya adı verildiğinde anlayabilecekleri için ekstra seçenekler vb. +Ayrıca kaçan gerekebilir (örneğin \+)


Her ikisi de harika cevaplar, ama biraz daha hızlı olduğu ve mv -ther ikisi de + 1s açıklamak için kaosa vermek zorunda !
Arronical
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.