Sử dụng '*' trong tập lệnh shell

Oct 14 2020

Tôi đang cố gắng chạy một ví dụ lệnh:

sudo mv /home/vaishnavi/Downloads/*.ttc /home/vaishnavi/Downloads/*.ttf /usr/local/share/fonts/ms_fonts/

Nó hoạt động tốt trong thiết bị đầu cuối, nhưng khi tôi cố gắng thêm điều này vào tập lệnh shell ( .sh), tôi gặp lỗi nói:

mv: cannot stat '/home/vaishnavi/Downloads/*.ttf': No such file or directory

Đơn giản, tôi muốn di chuyển tất cả các tệp .ttfvà .ttcnhập vào /usr/local/share/fonts/ms_fonts/, trong trường hợp này. Thành thật mà nói, tôi không phải là chuyên gia về kịch bản shell. Xin hãy giải thích cho tôi tôi đã làm sai điều gì và cũng là một giải pháp thay thế để tôi đạt được kết quả như mong đợi.

Kịch bản mẫu của tôi:

sudo mv /home/vaishnavi/Downloads/*.ttc /home/vaishnavi/Downloads/*.ttf /usr/local/share/fonts/ms_fonts/  
...

exit 0

Trả lời

3 glennjackman Oct 14 2020 at 19:32

Bạn sẽ gặp lỗi này nếu không có tệp * .ttf nào ở đó. Theo mặc định, nếu không có tệp nào phù hợp với mẫu hình cầu thì bản thân mẫu đó vẫn nằm trong lệnh. Tắt tính năng này bằng nullglobtùy chọn bash shell

Để an toàn hơn một chút, hãy xác minh rằng thực sự có một số tệp cần di chuyển:

#!/usr/bin/env bash
...
shopt -s nullglob
# store files in an array
files=( /home/vaishnavi/Downloads/*.{ttc,ttf} )
# and if the array is not empty, move the files.
if (( ${#files[@]} > 0 )); then sudo mv -t /usr/local/share/fonts/ms_fonts/ "${files[@]}" 
fi