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
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
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
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
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.
ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"
FIN
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.
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!
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.
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.
o:
cho tôi trong $ (ls -d /path/a/folder/*.ext); làm COMMAND “$ i”; làm xong;
Đ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. 🙂
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.
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.
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ì đó.
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.
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.
Rất tốt, phức tạp, nhưng rất thú vị.
điều này là tuyệt vời, tuyệt vời !!!!
Tuyệt vời, tính dẻo của GNU / Linux là không có giới hạn.
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