Cách sử dụng các lệnh chỉ hoạt động với một tệp tại một thời điểm với tất cả các tệp bạn chọn

Nhiều khi chúng ta cần chạy tập lệnh để chuyển pdf thành văn bản, chuyển đổi tệp .doc thành html, v.v.; vấn đề là các lệnh này chỉ chấp nhận một tệp tại một thời điểm và điều đó rất tẻ nhạt nếu chúng ta cần thực hiện cùng một tác vụ trên nhiều tệp, đặc biệt khi chúng ta thực hiện một tập lệnh.

Tôi đề xuất một giải pháp cho vấn đề này bằng cách sử dụng ls, khát, grep, ôi y sh. Những gì chúng ta sẽ làm là tạo dòng lệnh chính xác trong mỗi hàng và thực thi chúng với sh, và vì sh sẽ thực hiện từng dòng một nên việc tiêu thụ bộ nhớ ram sẽ không tăng lên, điều này với các phương pháp khác thậm chí có thể đóng băng các máy kém năng lực.

Hãy xem cách thực hiện chuỗi lệnh này.

1- Điều đầu tiên chúng tôi phải làm là giới thiệu các tệp sẽ được sử dụng thông qua ls:

ls --directory /camino/a/carpeta/*.ext

2- Sau đó, chúng tôi sẽ cần các tệp này để chuyển dấu ngoặc kép «/ path / đến nhóm
các tập tin«

ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/'

3- Bây giờ ôi nó sẽ sẵn sàng để nhận dữ liệu.

ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/' | awk '{print $0}'

Bởi vì ôi có ngôn ngữ riêng, chúng tôi sẽ cần tách các dấu ngoặc kép mà chúng tôi muốn xuất hiện để trích dẫn một văn bản trong số các hàm khác, chúng tôi sẽ cần sử dụng dấu gạch chéo ngược \ Hãy xem làm thế nào để tách một số.
Trích dẫn riêng biệt

\”

Hiển thị dấu gạch chéo ngược trong đầu ra (chúng ta sẽ cần nhập ba thanh)

\\\

Đôi khi chúng ta sẽ cần một dấu phân tách riêng biệt, chỉ văn bản hoặc dấu ngoặc kép xuất hiện trong hai dấu gạch chéo ngược mới được xuất trong đầu ra:

'""'\"\'""'

4- Hãy xem cách đổi tên tất cả các tệp được liệt kê bằng lệnh mv chỉ để nhập một hậu tố. (Bây giờ để liệt kê tệp, chúng ta sẽ cần sử dụng tổ hợp "$ 0" bất cứ khi nào chúng ta cần sử dụng nó)

ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/' | awk '{print "mv "$0" \"`dirname

"$ 0 ″" / Text-any-`basename "$ 0 ″" \ ""} '| sh

Lưu ý được thêm vào cuối như được hiển thị trong chuỗi trước đó sự kết hợp « | NS »Chuyển hướng đường ống tới trình thông dịch lệnh này

Hãy xem một số ví dụ được chuẩn bị để tạo một script.

Ejemplos:

1- Chuyển đổi tất cả các pdf được liệt kê thành tệp văn bản.

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh

Trong trường hợp này, không cần thiết phải chọn tệp đầu ra vì pdftotext tự động tạo tệp văn bản với tên cơ sở và miễn trừ .txt nếu và chỉ khi bạn đang làm việc với một tệp duy nhất.

2- Giả sử rằng chúng ta muốn áp dụng hiệu ứng cho một hình ảnh nhưng không sửa đổi ảnh gốc, hãy xem một ví dụ với hiệu ứng sóng nổi tiếng với logo Windows XP, vì nó là một lá cờ có hiệu ứng gợn sóng (để đánh giá tốt hơn hiệu ứng này, bạn nên sử dụng như hình ảnh kết quả có phần mở rộng .png).

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="convert -wave 25x150

"$0"","\"\`dirname "$0"`/`basename "$0" | sed '"'"s/\\\\.[[:alnum:]]*$//"'"'`-wave.`basename "$0" |
rev | awk -F . \'"'"'\{print $1}\'"'"'\ | rev`'""'\"\'""' "}' | sh

Lưu ý: một số đường chuyền được thực hiện theo trình tự này:

  • Một để lấy thư mục chứa tệp với tên dirname
  • Một cách khác để lấy tên cơ sở, nhưng xóa phần mở rộng của tệp đã nói
  • Một người khác để có được sự miễn trừ của tệp đã nói.

3- Bây giờ chúng ta hãy xem cách đổi tên một nhóm tệp bằng cách đặt số tương ứng trước tên (hậu tố số).

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="mv "$0" '""'\"\'""'`dirname
"$0"`/"FNR"-`basename "$0"`'""'\"\'""' "}' | sh

Để nhập số, ngôn ngữ awk nội bộ đã được sử dụng với tùy chọn "FNR" liệt kê từng dòng đầu ra, vì vậy số có thể được đặt trước hoặc sau văn bản.

Hãy xem cách đặt tiền tố số (đặt một số ở cuối, nhưng trước phần miễn trừ) tùy chọn này chỉ hợp lệ nếu tệp có a.

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="mv "$0" \"`dirname
"$0"`/`basename "$0" | sed '\'s/\\\\.[[:alnum:]]*$//\''`-"FNR".`echo "$0" | rev | awk -F .
'""'\'\'""'{print $1}'""'\'\'""' | rev `\" " }' | sh

4- Hãy xem một ví dụ trong đó chúng ta sẽ phải nhập dữ liệu hoặc chọn một nhóm chức năng, lấy ví dụ như trường hợp chúng ta xóa bảo vệ bằng mật khẩu khỏi một số tệp pdf có cùng mật khẩu. (Trong trường hợp này, chúng tôi sẽ sử dụng zenity làm hộp thoại)

zenity --entry --hide-text --text "introduzca la clave de desbloqueo" > $HOME/.cat && ls
--directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="pdftk "$0" input_pw `cat
$HOME/.cat` output \"`dirname "$0"`/`basename "$0" .pdf`-unlock.pdf\" "}' | sh && rm
$HOME/.cat

Tùy thuộc vào phiên bản của zenity, tùy chọn cho mật khẩu có thể chỉ là –pasword.

Như bạn đã thấy, mục tiêu là tạo một tệp tin sẽ được tạo ở đầu dòng chỉ một lần và sau đó sẽ bị xóa khi quá trình chuyển đổi hoàn tất.

5- Một tiện ích khác là khi chúng ta cần giải nén một số tệp được nén trong .zip

ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "unzip -x "$0" "}' | sh

Các dấu ngoặc kép phải được phân tách bằng dấu cách nơi tùy chọn "$ 0" được sử dụng.
thí dụ
"unzip -x "$0" "

6- Hãy xem một ví dụ để bảo vệ một bản pdf bằng mật khẩu, cho phép đọc nhưng được bảo vệ khỏi bản in hoặc các tùy chọn khác, (các tùy chọn được liệt kê trong hộp thoại sẽ là những tùy chọn sẽ được phép trong pdf, nếu bạn không muốn cho phép bất kỳ tùy chọn nào trong số đó không chọn).

zenity --separator " " --multiple --text "Seleccione los Opciones que quiere permitir" --column "Opciones" --list "Printing" "DegradedPrinting" "ModifyContents" "CopyContents" "ScreenReaders" "ModifyAnnotations" "AllFeatures" > $HOME/.cat && zenity --entry --hidetext --text "Teclee la contraseña de protección" > $HOME/.cat2 && ls --directory "$@" | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="echo \"pdftk \\\"`echo "$0"`\\\" output \\\"`dirname "$0"`/`basename "$0" .pdf`-locked.pdf\\\" allow `cat $HOME/.cat` owner_pw \"`cat $HOME/.cat2`\"\" | sh "}' | sh && rm $HOME/.cat $HOME/.cat2

Với những ví dụ này, nó là khá ví dụ về cách sử dụng tùy chọn này để chuyển đổi, sửa đổi hoặc đổi tên một số tệp bằng một tập lệnh duy nhất và không chuyển đổi chúng bằng tay từng cái một. Mức tiêu thụ bộ nhớ với tùy chọn này là tối thiểu, tùy thuộc vào lệnh đang được sử dụng, vì nó không chuyển đổi chúng cùng một lúc mà chuyển đổi lần lượt.

Tùy chọn này có thể rất hữu ích nếu chúng ta muốn chuyển đổi toàn bộ nhóm video bằng mencoder mà không có mencoder này nối chúng thành một; bạn có thể chuẩn bị một kịch bản cho việc này và họ chỉ cần đặt ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"

FIN


Để lại bình luận của bạn

địa chỉ email của bạn sẽ không được công bố. Các trường bắt buộc được đánh dấu bằng *

*

*

  1. Chịu trách nhiệm về dữ liệu: Miguel Ángel Gatón
  2. Mục đích của dữ liệu: Kiểm soát SPAM, quản lý bình luận.
  3. Hợp pháp: Sự đồng ý của bạn
  4. Truyền thông dữ liệu: Dữ liệu sẽ không được thông báo cho các bên thứ ba trừ khi có nghĩa vụ pháp lý.
  5. Lưu trữ dữ liệu: Cơ sở dữ liệu do Occentus Networks (EU) lưu trữ
  6. Quyền: Bất cứ lúc nào bạn có thể giới hạn, khôi phục và xóa thông tin của mình.

  1.   Ramiro dijo

    Nó sẽ không phải là rất nhiều, nhưng dễ dàng hơn rất nhiều để thực hiện tất cả những điều này bằng cách sử dụng biểu thức chính quy hoặc ký tự đại diện? Tôi không hiểu sự khác biệt giữa điều đó là gì và khiến cuộc sống của bạn trở nên phức tạp với điều này.

  2.   thóp dijo

    Sự thật được đánh giá cao, bạn có kiến ​​thức tuyệt vời về các lệnh linux. Rất hữu dụng!

    1.    KZKG ^ Gaara dijo

      Vâng, tôi biết chúng tôi sẽ học hỏi được rất nhiều điều với anh ấy ở đây hahaha.

  3.   lục giác dijo

    Tôi nghĩ điều này dễ dàng hơn nhiều:

    ls -d /path/to/folder/*.ext | trong khi đọc tệp; làm COMMAND "$ file"; làm xong

    Thay vì COMMAND, bạn có thể đặt bất cứ thứ gì bạn muốn và nó hoạt động ngay cả khi các tệp chứa khoảng trống miễn là bạn đặt $ tệp giữa các dấu ngoặc kép. Bạn không cần sử dụng sed cho điều đó hoặc tạo các lệnh với awk. Ngoài ra, điều này khởi chạy ít quy trình hơn.

    1.    Ankh dijo

      o:
      cho tôi trong $ (ls -d /path/a/folder/*.ext); làm COMMAND “$ i”; làm xong;

      1.    lục giác dijo

        Điều đó có vẻ tốt, nhưng nếu tên tệp chứa khoảng trống thì nó không hoạt động. 🙂

        1.    làm sạch dijo

          Trên thực tế, hexborg là lý do tại sao văn bản đầu ra được trích dẫn ở đầu và cuối cho mỗi dòng với tùy chọn này:
          ls –thư mục | sed 's / ^ / »/' | sed 's / $ / »/'

          Tôi làm rõ rằng tìm thấy có thể được sử dụng để tìm kiếm các thư mục con.

          1.    lục giác dijo

            Nhưng với thủ thuật của tôi, bạn không cần phải làm vậy. ls lấy tên đầy đủ của các tệp trên mỗi dòng và đọc lần lượt từng dòng và để lại tên tệp trong biến tệp cho dù nó có khoảng trống hay không. Bạn chỉ cần đặt dấu ngoặc kép xung quanh $ file khi sử dụng nó trong lệnh.

          2.    Hugo dijo

            Tôi đồng ý rằng nó có thể bớt cồng kềnh hơn. Hãy lấy ví dụ này từ bài báo:

            ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh

            Điều tương tự cũng có thể đạt được như thế này và nó có thể chạy nhanh hơn:

            find . -type f -print0 | xargs -0 pdftotext

            Điều đó nói rằng, bài viết được hoan nghênh, luôn tốt để tìm hiểu về những cách thay thế để làm điều gì đó.

        2.    Ankh dijo

          Nếu bạn nhận thấy $ i trong dấu ngoặc kép. Điều đó làm cho việc thoát ra khoảng trắng là không cần thiết.

          1.    lục giác dijo

            Có, nhưng toán tử $ () mở rộng tên tệp mà không đặt dấu ngoặc kép ở bất kỳ đâu, vì vậy biến tôi đã bắt tên của các tệp đã cắt. Hãy thử nó trong một thiết bị đầu cuối trong một thư mục có các tệp có dấu cách trong tên.

  4.   Leo dijo

    Rất tốt, phức tạp, nhưng rất thú vị.

  5.   helena_ryuu dijo

    điều này là tuyệt vời, tuyệt vời !!!!

  6.   msx dijo

    Tuyệt vời, tính dẻo của GNU / Linux là không có giới hạn.

  7.   Natalia dijo

    Gửi blogger,

    Tôi là Natalia, Giám đốc Truyền thông tại Paperblog. Sau khi phát hiện ra nó, tôi đang liên hệ với bạn để mời bạn biết về dự án Paperblog, http://es.paperblog.com, một dịch vụ báo chí công dân mới. Paperblog là một nền tảng kỹ thuật số, giống như một tạp chí blog, xuất bản các bài báo hay nhất của các blog đã đăng ký.

    Nếu khái niệm này khiến bạn quan tâm, bạn chỉ cần đề xuất blog của mình tham gia. Các bài viết sẽ được đính kèm với tên / bút danh và tệp hồ sơ của bạn, cũng như một số liên kết đến blog gốc, ở đầu và cuối mỗi bài. Những người thú vị nhất có thể được nhóm chọn để xuất hiện trên Trang bìa và bạn có thể được chọn là Tác giả của ngày.

    Tôi hy vọng bạn được thúc đẩy bởi dự án mà chúng tôi đã bắt đầu với sự nhiệt tình như vậy vào tháng 2010 năm XNUMX. Hãy xem và đừng ngần ngại viết thư cho tôi để biết thêm chi tiết.

    Nhận một lời chào thân ái và trìu mến,
    Natalia