Xargs

2009-02-04 13 views
51

aşağıdaki komutu çalıştırmak için çalışıyorum takma adlar Bu bir parametre alır). Görünüşe göre, xargs bunları çalıştırabileceği şeyler olarak kabul etmiyor. Bunu düzeltmenin akıllıca bir yolu var mı?Xargs

+1

Bu şimdiye yerine benim ~/bin klasörü komut dosyaları oluşturmak nedenlerinden biridir bash takma adları oluşturma. Bu şekilde, takma adlarımı herhangi bir kabuktan kullanabilirim: BASH, ZSH, IPYTHON veya FISH. – Yoo

+2

İşte benzer (ama aynı değil) bir soru: http: // stackoverflow.com/questions/979453/how-can-i-use-aliased-commands-with-xargs –

cevap

34

için parametre olarak bu komut dosyasının adını geçirmek: Bu find tarafından döndürülen her dosya için bash başlayan ibaret olmasına rağmen

, böylece küçük bir shell script yazabilirsiniz Sadece etkileşimli kabuğun takma adlar hakkında bilgisi var, neden sadece xargs aracılığıyla takılmadan takma adı çalıştırmıyorsunuz? Eğer dosya adları onları yeni satır yok eminseniz

find . -iname '.#*' -print0 | while read -r -d '' i; do foobar "$i"; done 

(Tran, neden? olurdu), sen beri, hatta

find . -iname '.#*' -print | while read -r i; do foobar "$i"; done 

ya da sadece find -iname '.#*' | ... bu kolaylaştırabilirsiniz varsayılan dizin . ve varsayılan eylem -print'dur.

Bir daha alternatif: kelimeler satırbaşıyla sadece split (: IFS=$' \t\n' varsayılan) olan

IFS=$'\n'; for i in `find -iname '.#*'`; do foobar "$i"; done 

söylüyorum Bash. Bununla birlikte, buna dikkat etmelisiniz; Bazı betikler değiştirilmiş bir $IFS ile iyi başa çıkmaz. Ayrıca args sayısını belirleyebilir Bash Eğer kullanma

+1

Bu cevap, NEDEN xargs kullanamadığımızı ve nasıl xas'ları takma ad ile kullanabileceğimizi yanıtlıyor. –

+0

Bu cevap bize xargs kullanarak * alternatifler * veriyor. Xargs * kullanarak çalışan bir cevap için, ilgili sorudaki @ camh cevabına bakın: http://stackoverflow.com/questions/979453/how-can-i-use-aliased-commands-with-xargs (Nathan Fellman yukarıda bağlı) –

1

Genellikle böyle bulmak kullanın:

find . -iname '' -exec cmd '{}' \; 

'{}' dosya ve \ ile değiştirilir alacak; yürütme zincirini sonlandırmak için gereklidir. Bu senin fonksiyonu ile işe yaramazsa Ancak, bash aracılığıyla çalıştırmak gerekebilir: Bir satırda

find .. |sed -e "s/.*/cmd '&'/"|bash 

Bul baskılar her dosya, sed sadece komut ile bu önek ve ardından boru onu vurmayı yürütme için. Ne olacağını görmek için | bash'ı atlayın.

+0

Yeni bir GNU bulgusu kullanıyorsanız, '-exec cmd 'yerine {}' +' kullanın: bu daha çok xargs gibi davranır Bunun içinde, bulunan her dosya için yeni bir cmd yürütmek yerine argümanları tek bir işlem halinde topluca işleyecektir. – ephemient

+0

Onun işlevinin birden fazla parametre alabileceğini düşünmekteyim ki, xargs'e -L 1 seçeneklerini sunmuyordu ... – Alnitak

+0

Oh, işte bu -L mi? Ben bakmadım ve bu amaçla -n kullanıyorum. – ephemient

4

xargs onun parametre olarak verilen programıexec edebilmek için beklediği nedeniyle çalışmıyor.

Sizin durumunuzda foobar beri bir bash diğer ad veya işlevi yürütmek için hiçbir program yoktur.

#!/bin/bash 
. $(HOME)/.bashrc 
func $* 

ve O zamandan beri xargs

+0

Bu betiği nereye yerleştirmeliyim ki * bu * xargs tarafından tanınır? –

+0

@NickVolynkin, nerede isterseniz, $ PATH'de olduğu veya konumunun doğrudan "xargs" değerini verdiği sürece. – Alnitak

+0

tamam, açıklama için teşekkürler. –

8

böylece gibi diğer adı (ya da fonksiyon) geçirilen:

alias myFuncOrAlias='echo' # alias defined in your ~/.bashrc, ~/.profile, ... 
echo arg1 arg2 | xargs -n 1 bash -cil 'myFuncOrAlias "$1"' arg0 
echo arg1 arg2 | xargs bash -cil 'myFuncOrAlias "[email protected]"' arg0 
İlgili konular