Aşağıdaki, yaklaşımınızın doğrudan düzeltilmesidir:
find . -type f -name 'file*' -exec sh -c 'x="{}"; mv "$x" "${x}_renamed"' \;
Ancak, eşleşen dosyalarınız varsa bu çok pahalıdır, çünkü mv
her bir eşleşme için (a'yı çalıştıran ) taze bir kabuk başlatırsınız . Herhangi bir dosya adında komik karakterleriniz varsa, bu patlayacak. Daha verimli ve güvenli bir yaklaşım şudur:
find . -type f -name 'file*' -print0 | xargs --null -I{} mv {} {}_renamed
Ayrıca, garip olarak adlandırılmış dosyalarla çalışma avantajına da sahiptir. Eğer find
destekliyorsa, bu azaltılabilir
find . -type f -name 'file*' -exec mv {} {}_renamed \;
xargs
Kullanmadığınız zamanlarda versiyonu yararlıdır {}
olduğu gibi,
find .... -print0 | xargs --null rm
Burada bir rm
kez (veya birkaç kez çok sayıda dosyayla) çağrılır, ancak her dosya için değil.
Ben kaldırıldı basename
muhtemelen yanlış olduğu için size, soru: Eğer hareket edeceğini foo/bar/file8
için file8_renamed
değil foo/bar/file8_renamed
.
Düzenlemeler (yorumlarda önerildiği gibi):
find
Olmadan kısaltılmış eklendixargs
- Eklenen güvenlik etiketi
x
işe yaramaz:find . -type f -name 'file*' -exec mv {} "{}_renamed" \;
xargs
versiyon ilk örnekteki gibi aynı verimi / var