perintah bash untuk setiap file dalam folder

31

Saya memiliki satu set file yang ingin saya terapkan perintah yang sama dan output harus berisi nama yang sama dengan file yang diproses tetapi dengan ekstensi yang berbeda.

Saat ini saya sedang melakukan rename /my/data/Andrew.doc menjadi /my/data/Andrew.txt saya ingin melakukan ini untuk semua file .doc dari folder / my / data / dan untuk mempertahankan namanya.

Saya mencoba beberapa versi tetapi saya rasa ada sesuatu yang salah dalam sintaks ketika saya baru mengenal linux.

Robert
sumber
→ contoh yang sedikit lebih lengkap & praktis: stackoverflow.com/a/43474757/444255
Frank Nocke

Jawaban:

76

Setidaknya ada seratus ribu juta cara berbeda dalam mendekati hal ini, tetapi berikut adalah pesaing utama:

Bash untuk loop

for f in ./*.doc; do
    # do some stuff here with "$f"
    # remember to quote it or spaces may misbehave
done

Menggunakan find

The findperintah memiliki kecil yang indah execperintah yang besar untuk menjalankan hal-hal (dengan beberapa peringatan). Cari lebih baik daripada globbing dasar karena Anda benar-benar dapat memfilter file yang Anda pilih. Hati-hati dengan sintaks aneh.

find . -iname '*.doc' -exec echo "File is {}" \;

Catatan yang findbersifat rekursif sehingga Anda mungkin ingin menggunakan -maxdepth 1untuk tetap finddalam direktori kerja saat ini. -type fdapat digunakan untuk memfilter file biasa.

Jika kita hanya mengganti nama dokumen menjadi txt ...

The renameperintah sed-seperti dalam mencari. Jelas ini tidak akan melakukan apa pun untuk mengubah format.

rename 's/doc$/txt/' *.doc
Oli
sumber
22
for i in *.doc ; do mv "$i" $(echo $i | sed s/doc/txt/) ; done
DIRAVI
sumber