ImageMagick bash script lỗi khi convert nhiều file?

Discussion in 'Hỏi Đáp Kỹ Thuật' started by money, Sep 29, 2019.

  1. money

    money Hương Chủ

    Mình cần resize khá nhiều file ảnh trên server nên chọn imagemagick.
    Khi mình chạy trên console resize 1 file thì ok.
    Tạo bash script resize vài file cũng OK nhưng khi resize vài chục file thì nó vẫn tạo ra file ảnh resize như bình thường nhưng file mới tạo ra không thể download về được. Khi download báo lỗi: The filename, directory name, or volume label syntax is incorrected.
    Lệnh chạy trên console hay bash script đều giống nhau, như sau:
    convert path-to-file1 -resize random-number -quanlity 80 path-to-resize-file1
    Con số random-number ở trên là 1 số cụ thể mình sinh ra, trong khoảng 300-400, ngẫu nhiên cho từng file.
    Anh em nào có kinh nghiệm vụ này chỉ giúp với. Cám ơn anh em.
     
  2. xmenvn2510

    xmenvn2510 Moderator + MiddleMan Staff Member

    Anh đọc bài này xem https://guides.wp-bullet.com/batch-resize-images-using-linux-command-line-and-imagemagick/
    Em phỏng đoán nó lỗi do cái phần random-number mà anh đặt, có thể do kích thước ảnh cần convert nhỏ hơn.

    Hoặc anh thử tăng gấp đôi các dấu ngoặc kép xung quanh mã điều kiện.
     
    money likes this.
  3. money

    money Hương Chủ

    Random number thì chắc chắn nhỏ hơn kích thước gốc em ạ.
    Gấp đôi dấu ngoặc kép là sao em? Bash script của anh chỉ là N line, mỗi line là 1 lệnh convert chứ ko có điều kiện nào.
     
  4. xmenvn2510

    xmenvn2510 Moderator + MiddleMan Staff Member

    Vậy anh convert thủ công ah. path-to-file1 và path-to-resize-file1 là anh tự nhập vào hả.

    ví dụ:
    Code:
    for i in/home/projs/proj1/img/*.png;do
    convert "$i"-resize 130X130"/home/projs/proj1/imgResized/${i##*/}"
    done
    
     
  5. console

    console Bang Chúng

    Hay do space trong file name anh
     
  6. money

    money Hương Chủ

    Anh viết code C# sinh ra bash script. Vì ko biết cách sinh random number cho từng line nên ko dùng loop trong bash script. Còn nếu viết như em thi nó cố định size luôn rồi, ko đúng yêu cầu.
     
  7. money

    money Hương Chủ

    File name & file path anh ko có space
     
  8. xmenvn2510

    xmenvn2510 Moderator + MiddleMan Staff Member

    cái random number cũng sinh được ngẫu nhiên mà a. E ví dụ thế thôi. A ngâm cứu tiếp đê. Hehe
     
    Last edited: Sep 29, 2019
    money likes this.
  9. EDM

    EDM Sơ Nhập Giang Hồ

    Anh xem mấy file tạo ra phân quyền với có cho down gì hk?
     
    money likes this.
  10. money

    money Hương Chủ

    Để chiều ngồi máy anh check lại. Mà khả năng mấy folder đó ổn vì anh tạo bằng mkdir dưới quyền root
     
  11. wpresources

    wpresources Bang Chúng

    Anh viết bằng C trước thì chỗ cần random chỉ cần phép toán đơn giản như nối chuỗi kèm chỗ random là được mà.Kiểu
    convert "$i"-resize "+random.Next(width)+"X"+random.Next(height)+"/home/projs/proj1/imgResized/${i##*/}"
    Hay random của anh có gì đặc biệt?

    Lỗi anh nói thì không chỉ do khoảng trắng có thể do lỗi ngôn ngữ nữa.
    https://thuthuat.taimienphi.vn/loi-...r-volume-label-syntax-is-incorrect-4299n.aspx

    Để chắc chắn nó là lỗi ngôn ngữ thì anh gõ lệnh linux đổi tên nó thành tên đơn giản thôi abc.định dạng file
    mv tên_file_ảnh_lỗi abc.jpg
    Thành công thì đúng anh lỗi tên rồi
     
  12. EDM

    EDM Sơ Nhập Giang Hồ

    phần path to file a tạo ra có trong "" hk?
     
  13. money

    money Hương Chủ

    Cái anh tạo ra là 1 số cụ thể, như 350, 315 ...
    Câu lệnh (mà anh sinh ra trong bash) anh chạy bằng tay trên terminal được. Copy nhiều lệnh chạy cũng ok. Chỉ bị lỗi khi chạy bash script với vài chục lệnh (nếu bash cỡ chục lệnh thì ok). Và đây là vấn đề mà anh ko hiểu sao nó lại như vậy?
    Anh ko có dấu nháy vì path to file không có khoảng trắng.
     
  14. money

    money Hương Chủ

    Anh copy từ file bash vào terminal chạy nó ok.
     
  15. wpresources

    wpresources Bang Chúng

    Anh muốn random theo danh sách cụ thể thì câu lệnh như dưới đây.

    Code:
    private int[] allowedValues = new int[] { x, x , x , 350 , 315 };
    
    private int GetRandomNumber(){
        return allowedValues[new Random().next(allowedValues.Length)];
    }
    Nếu đã chạy được thành công chục file thì em nghĩ do hai nguyên nhân
    +định dạng tên file imagematrick không hiểu,không có trong quy định của nó chẳng hạn
    +Kích cỡ ảnh cần xử lý không phù hợp
    Nên nó không nhận biết và xử lý được.
     
    Last edited: Sep 29, 2019
  16. money

    money Hương Chủ

    Anh muốn random luôn trên bash mà. Chứ random code của ngôn ngữ khác thì dễ rồi em.
     
  17. wpresources

    wpresources Bang Chúng

    Hì bên trên em thấy anh bảo viết bằng C trước nên em tưởng trọn gói luôn.Nếu anh muốn viết riêng random với câu lệnh thì nó như dưới đây
    Code:
    #!/bin/bash
    
    function getNumerRandom(){
    declare -a arr=("350" "315" "120")
    rand=$[$RANDOM % ${#arr[@]}]
    echo ${arr[$rand]}
    }
    getNumerRandom
    
     
    money likes this.
  18. money

    money Hương Chủ

    À bash cũng cho call function luôn hả em? Vụ này anh ko biết. Để áp dụng thử.
     
    wpresources likes this.
  19. xmenvn2510

    xmenvn2510 Moderator + MiddleMan Staff Member

  20. money

    money Hương Chủ

    Chưa em, sáng giờ anh chưa đụng laptop. Chắc để mai :D Tối còn đi chơi.