Saya punya skrip ini
#!/bin/bash
folder='/home/data/mnist/training'
for filePng in $folder/*
do
touch $filePng.txt
done
Ini berfungsi, hanya itu, untuk file bernama 001.png
, itu menciptakan 001.png.txt
bukan 001.txt
.
Bagaimana saya bisa memodifikasi ini?
for filePng in "$folder"/*
dantouch "$filePng".txt
- perhatikan bahwa Anda hanya mengutipnya ketika didahului oleh a$
.Jawaban:
Anda dapat menggunakan
basename
perintah di sini:Perhatikan tambahannya
$folder/
. Ini diperlukan karena perintah basename menghapus path dari.sumber
$filePng
- itu berguna juga.$( )
menetapkan konteks kutipan baru.Anda dapat menghapus ekstensi yang ada menggunakan fitur ekspansi parameter shell
Jadi dalam kasus Anda, gantikan
$filePng.txt
dengan"${filePng%.png}.txt"
sumber
Dengan variasi pada apa yang telah disebutkan steeldriver - ekspansi parameter - kita dapat menggunakan penggantian string untuk melakukan pekerjaan itu. Selain itu, Anda harus mengutip variabel. Di bawah ini adalah skrip Anda yang diedit.
sumber
Jika Anda memiliki banyak file untuk membuatnya, ada baiknya “menyentuh” lebih dari satu file sekaligus, sehingga Anda tidak perlu melakukan proses baru untuk masing-masing file (yang membutuhkan waktu cukup lama jika dilakukan beberapa kali) seribu kali).
Opsi 1: substitusi pola +
xargs
Opsi ini akan menyediakan beberapa jalur ke
touch
perintah sekaligus, biasanya beberapa ribu atau apa pun yang dapat ditampung sistem pada satu baris perintah.Opsi 2: ekspansi parameter + pengarahan output perintah
Opsi ini tidak berjalan
touch
sama sekali tetapi menggunakan fitur shell Bash / Bourne / POSIX sebagai gantinya yang tidak memerlukan sub-proses sama sekali.sumber
Jika Anda yakin bahwa Anda tidak memiliki file dengan
.png
suatu tempat di tengah nama, maka Anda bisa menggunakan array dengan ekspansi parameter:Toko ini semua jalan ke file berakhiran
.png
dalam array dan kemudian menggunakan ekspansi parameter untuk membuat daftar.txt
file, dengan menggantikan.png
untuk.txt
masing-masing satu.Ingatlah bahwa ini akan pecah jika Anda memiliki begitu banyak file yang tidak dapat diteruskan sebagai argumen untuk permohonan yang sama
touch
.sumber