Mã shell của bạn có hai vấn đề:
- Không
echo
nên ở đó.
- Biến
$i
bị nhập sai như $1
trong tên tệp đích.
Để tạo một bản sao của một tệp trong cùng thư mục với chính tệp đó, hãy sử dụng
cp thefile thecopy
Nếu bạn chèn bất cứ thứ gì khác vào đó, vd
cp thefile theotherthing thecopy
sau đó người ta cho rằng bạn muốn sao chép thefile
và theotherthing
vào thư mục được gọi thecopy
.
Trong trường hợp của bạn, nó đặc biệt tìm kiếm một tệp được gọi test.ogg
và một tệp có tên echo
để sao chép vào thư mục test$1.ogg
.
Các $1
rất có thể sẽ mở rộng ra một chuỗi rỗng. Đây là lý do tại sao, khi bạn xóa lệnh echo
khỏi lệnh, bạn sẽ nhận được "test.ogg và test.ogg là cùng một tệp"; lệnh đang được thực thi về cơ bản là
cp test.ogg test.ogg
Đây có lẽ là một sai lầm.
Cuối cùng, bạn muốn một cái gì đó như thế này:
for i in {1..100}; do cp test.ogg "test$i.ogg"; done
Hoặc, như là một thay thế
i=0
while (( i++ < 100 )); do
cp test.ogg "test$i.ogg"
done
Hoặc, sử dụng tee
:
tee test{1..100}.ogg <test.ogg >/dev/null
Lưu ý: Điều này rất có thể sẽ hoạt động cho 100 bản sao, nhưng đối với hàng ngàn bản sao, nó có thể tạo ra lỗi "danh sách đối số quá dài". Trong trường hợp đó, trở lại sử dụng một vòng lặp.
echo
cái không nên có, và cái$1
nào nên có$i
?