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ü mvher 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 finddestekliyorsa, bu azaltılabilir
find . -type f -name 'file*' -exec mv {} {}_renamed \;
xargsKullanmadığınız zamanlarda versiyonu yararlıdır {}olduğu gibi,
find .... -print0 | xargs --null rm
Burada bir rmkez (veya birkaç kez çok sayıda dosyayla) çağrılır, ancak her dosya için değil.
Ben kaldırıldı basenamemuhtemelen yanlış olduğu için size, soru: Eğer hareket edeceğini foo/bar/file8için file8_renameddeğil foo/bar/file8_renamed.
Düzenlemeler (yorumlarda önerildiği gibi):
findOlmadan kısaltılmış eklendixargs
- Eklenen güvenlik etiketi
xişe yaramaz:find . -type f -name 'file*' -exec mv {} "{}_renamed" \;xargsversiyon ilk örnekteki gibi aynı verimi / var