Saya ingin menghapus semua ekstensi .sh jadi ini:
ls *.sh | xargs -I {} mv {} `basename {} .sh`
Namun tidak berfungsi, berperilaku seperti basename
mengembalikan nama file yang tidak berubah.
Mengapa berperilaku seperti itu?
Misalnya, ini berfungsi:
ls *.sh | xargs -I {} echo `basename {}.jpg .jpg`;
EDIT :
Solusi: kutipan tunggal mencegah `basename ...`
evaluasi oleh shell sebelum perintah dijalankan.
ls *.sh | xargs -I {} sh -c 'mv {} `basename {} .sh`'
bash
text-processing
xargs
majkinetor
sumber
sumber
-i
opsi, tetapi opsi 'klasik' tersebut telah usang. Sebagai contoh untuk menggunakan hanya satu opsi / baris, halaman manual POSIX baru merekomendasikan-L1
. Untuk memanggil perilaku lama-i
, halaman merekomendasikan-I'{}'
opsi.rename
, misalnya:rename 's/\.sh//' *.sh
. Coba dulu dengan dry-run (-n
).rename
bekerja dengan baik, dan cukup sederhana, tapi ingat itu sangat spesifik distribusi. Distribusi berbasis RHEL dan Debian menyediakanrename
perintah yang berbeda , jadi orang harus mengingatnya saat membuat skrip lintas-distro.Saya tidak yakin tentang pertanyaan Anda, apakah Anda benar-benar bertanya mengapa kalimat pertama Anda tidak berfungsi? Atau apakah Anda mencari metode yang tepat untuk mengganti nama semua file .sh?
Dengan asumsi itu adalah metode terbersih, saya lebih suka menyiapkan opsi perintah sebelumnya
xargs
. Untuk menghapus ekstensi file .sh, saya sering mempertimbangkan pendekatan ini,sumber