Bir bash komut dosyasında aşağıdakine benzer bir komut çalıştırmaya çalışıyorum. Tüm alt klasörleri aramalı $sourcedir
ve belirli bir türdeki tüm dosyaları kök düzeyine kopyalamalıdır $targetdir
.
#!/bin/bash
# These are set as arguments to the script, not hard-coded
sourcedir="/path/to/sourcedir"
targetdir="/path/to/targetdir"
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2/`basename "$1"`"' "{}" "$targetdir" \;
Dışında bu, oldukça yakın görünüyor {}
olarak değil geçirilen $2
için-exec sh -c ...
Bunu dosya adlarındaki özel karakterlere (özellikle tek tırnak karakterlerine) toleransla, mümkün olduğunca "doğru yola" yakın yapmak istiyorum.
Düzenleme: Ben insanlar kullanarak xargs
veya argüman zincirleme önermek görüyorum . Bunun sadece sınırlı sayıda argüman için iyi olduğu izlenimindeydim. Örneğin, galeri dizinlerinden birkaçını dev bir slayt gösterisi dizinine kopyalamaya çalıştığım binlerce .jpg dosyası varsa, argümanları zincirleyen çözümler hala çalışır mı?
Düzenleme 2: Benim sorunum bir komutta _
sh benim ilk seçenek önce eksik oldu -exec
. Find komutunun nasıl çalışacağını merak eden herkes için şunu ekleyin _
ve her şey yoluna girecektir:
find "$sourcedir" -type f -name "*.type" -exec sh -c 'cp "$1" "$2"' _ "{}" "$targetdir" \;
Yine de aynı cevabı yerine getirdiğinden, ancak daha verimli ve zarif olduğu için aşağıdaki cevabı kabul ettim.
xargs
normal komutlarda büyük miktarlarda argümanı otomatik olarak ele almak için neden bu kadar yaratıldığı tam olarak budur . Ayrıca, maksimum argüman sınırlarının çoğunun standart GNU araçları için büyük ölçüde geliştirildiğini dikkate almak gerekir. Ayrıca binlerce dosyada ilgili olan tüm bu işlem çatallarından kaçınarak bir performans avantajı göreceksiniz.