Sering kali kita perlu menjalankan skrip untuk mengubah pdf menjadi teks, mengubah file .doc menjadi html, dll; Intinya adalah perintah ini hanya menerima satu file dalam satu waktu dan itu sangat membosankan jika kita perlu melakukan tugas yang sama pada beberapa file, terutama saat kita membuat skrip.
Saya mengusulkan solusi untuk masalah ini menggunakan ls, sed, grep, Wow y sh. Apa yang akan kita lakukan adalah membuat baris perintah yang benar di setiap baris dan mengeksekusinya dengan sh, dan karena sh akan mengeksekusi satu baris dalam satu waktu, konsumsi memori ram tidak akan meningkat, yang dengan metode lain bahkan dapat membekukan mesin yang kurang bertenaga.
Mari kita lihat bagaimana melakukan urutan perintah ini.
1- Hal pertama yang harus kita lakukan adalah memperkenalkan file yang akan digunakan ls:
ls --directory /camino/a/carpeta/*.ext
2- Kemudian kami akan membutuhkan file-file ini untuk memberikan tanda kutip «/ path / ke grup dari
file«
ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/'
3- sekarang Wow itu akan siap menerima data.
ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/' | awk '{print $0}'
Karena Wow memiliki bahasanya sendiri kita perlu memisahkan tanda kutip yang ingin kita munculkan untuk mengutip teks di antara fungsi lain yang kita perlukan untuk menggunakan garis miring terbalik \ Mari kita lihat bagaimana memisahkan beberapa.
Pisahkan kutipan
\”
Tunjukkan garis miring terbalik di output (kita perlu mengetikkan tiga batang)
\\\
Terkadang kita membutuhkan pemisah isolasi, hanya teks atau tanda kutip yang muncul di dalam dua garis miring terbalik yang akan menjadi keluaran:
'""'\"\'""'
4- Mari kita lihat cara mengganti nama semua file yang terdaftar menggunakan perintah mv hanya untuk memasukkan sufiks. (Sekarang untuk membuat daftar file kita perlu menggunakan kombinasi "$ 0" setiap kali kita perlu menggunakannya)
ls --directory /camino/a/carpeta/*.ext | sed 's/^/"/' | sed 's/$/"/' | awk '{print "mv "$0" \"`dirname
"$ 0 ″" / Text-any-`basename "$ 0 ″" \ ""} '| SH
Catatan ditambahkan di akhir seperti yang ditunjukkan pada urutan sebelumnya kombinasi « | SH »Yang mengarahkan kembali pipa ke penerjemah perintah ini
Mari kita lihat beberapa contoh yang disiapkan untuk membuat skrip.
Ejemplos:
1- Konversikan semua pdf yang terdaftar menjadi file teks.
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh
2- Katakanlah kita ingin menerapkan efek ke gambar tetapi tanpa memodifikasi aslinya, mari kita lihat contoh dengan efek gelombang yang terkenal untuk logo Windows XP, karena ini adalah bendera dengan efek bergelombang (untuk lebih menghargai efek ini, ini adalah disarankan untuk digunakan sebagai gambar hasil dengan ekstensi .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
Catatan: beberapa lintasan dibuat dalam urutan ini:
- Satu untuk mendapatkan folder tempat file tersebut berada dengan dirname
- Lain untuk mendapatkan nama dasar, tetapi menghapus ekstensi dari file tersebut
- Lain untuk mendapatkan pembebasan file tersebut.
3- Sekarang mari kita lihat cara mengganti nama sekelompok file dengan meletakkan nomor yang sesuai di depan nama (akhiran numerik).
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print FS="mv "$0" '""'\"\'""'`dirname
"$0"`/"FNR"-`basename "$0"`'""'\"\'""' "}' | sh
Mari kita lihat bagaimana meletakkan awalan numerik (letakkan angka di akhir, tapi sebelum pengecualian) opsi ini hanya valid jika file memiliki.
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- Mari kita lihat contoh di mana kita harus memasukkan data atau memilih sekelompok fungsi, mengambil contoh kasus di mana kita menghapus proteksi kata sandi dari beberapa file pdf yang memiliki kata sandi yang sama. (Dalam hal ini kita akan menggunakan zenity sebagai kotak dialog)
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
Seperti yang Anda lihat, tujuannya adalah untuk membuat kucing dari file yang akan dibuat di awal baris hanya sekali dan kemudian akan dihapus setelah konversi selesai.
5- Utilitas lain adalah, ketika kita perlu mengekstrak beberapa file yang dipadatkan dalam .zip
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "unzip -x "$0" "}' | sh
contoh
"unzip -x "$0" "
6- Mari kita lihat contoh untuk melindungi pdf dengan kata sandi, memungkinkan membaca tetapi dilindungi dari pencetakan salinan atau opsi lain, (opsi yang tercantum di kotak dialog adalah yang akan diizinkan dalam pdf, jika Anda tidak ingin dari mereka, jangan pilih tidak ada).
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
Dengan contoh-contoh ini, cukup dicontohkan bagaimana menggunakan opsi ini untuk mengonversi, memodifikasi, atau mengganti nama beberapa file dengan satu skrip dan tidak mengubahnya secara manual satu per satu. Konsumsi memori dengan opsi ini minimal, tergantung pada perintah yang digunakan, karena tidak mengubahnya pada saat yang sama tetapi satu per satu.
ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"
FIN
Bukankah itu banyak, tapi JAUH lebih mudah untuk melakukan semua ini menggunakan ekspresi reguler atau wildcard? Saya tidak mengerti apa perbedaan antara itu dan membuat hidup Anda begitu rumit dengan ini.
Sebenarnya, Anda memiliki pengetahuan yang bagus tentang perintah linux. Sangat berguna!
Ya, saya tahu kita akan belajar banyak dengannya di sekitar sini hahaha.
Saya pikir ini jauh lebih mudah:
ls -d /path/to/folder/*.ext | saat membaca file; lakukan COMMAND "$ file"; selesai
Alih-alih COMMAND Anda dapat meletakkan apa pun yang Anda inginkan dan itu berfungsi bahkan jika file berisi spasi kosong selama Anda meletakkan $ file di antara tanda kutip. Anda tidak perlu menggunakan sed untuk itu atau membuat perintah dengan awk. Juga ini meluncurkan lebih sedikit proses.
o:
untuk saya di $ (ls -d /path/a/folder/*.ext); lakukan PERINTAH “$ i”; selesai;
Itu terlihat bagus, tetapi jika nama file berisi kosong itu tidak berfungsi. 🙂
Faktanya, hexborg adalah alasan teks keluaran dikutip di awal dan di akhir untuk setiap baris dengan opsi ini:
ls –directory | sed 's / ^ / »/' | sed 's / $ / »/'
Saya mengklarifikasi bahwa find dapat digunakan untuk mencari subdirektori.
Tetapi dengan trik saya, Anda tidak perlu melakukannya. ls mengambil nama lengkap dari file satu di setiap baris dan membaca baris demi baris dan membiarkan nama file dalam variabel file apakah itu memiliki spasi kosong atau tidak. Anda hanya perlu memberi tanda kutip di sekitar $ file saat menggunakannya dalam perintah.
Saya setuju bahwa dalam menemukan itu bisa kurang merepotkan. Mari kita ambil contoh ini dari artikel:
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh
Hal yang sama dapat dicapai dengan baik seperti ini, dan mungkin berjalan lebih cepat:
find . -type f -print0 | xargs -0 pdftotext
Meskipun demikian, artikel ini disambut baik, selalu baik untuk mempelajari cara-cara alternatif dalam melakukan sesuatu.
Jika Anda memperhatikan $ i dalam tanda kutip. Itu membuat pelolosan spasi tidak diperlukan.
Ya, tetapi operator $ () memperluas nama file tanpa menempatkan tanda kutip di mana pun, jadi variabel i sudah menangkap nama file yang dipotong. Cobalah di terminal dalam direktori yang memiliki file dengan spasi pada namanya.
Sangat bagus, kompleks, tapi sangat menarik.
ini luar biasa, hebat !!!!
Luar biasa, plastisitas GNU / Linux tidak memiliki batasan.
Blogger yang terhormat,
Saya Natalia, Manajer Komunikasi di Paperblog. Setelah menemukannya, saya menghubungi Anda untuk mengundang Anda mengetahui proyek Paperblog, http://es.paperblog.com, layanan jurnalisme warga baru. Paperblog adalah platform digital yang, seperti majalah blog, menerbitkan artikel terbaik dari blog terdaftar.
Jika konsep tersebut menarik minat Anda, Anda hanya perlu mengusulkan blog Anda untuk berpartisipasi. Artikel akan disertai dengan nama / nama samaran dan file profil Anda, serta beberapa tautan ke blog asli, di awal dan di akhir masing-masing. Yang paling menarik dapat dipilih oleh tim untuk ditampilkan di Halaman Sampul dan Anda dapat dipilih sebagai Penulis hari ini.
Saya harap Anda termotivasi oleh proyek yang kami mulai dengan antusias di bulan Januari 2010. Silakan lihat dan jangan ragu untuk menulis kepada saya untuk lebih jelasnya.
Terima sapaan yang ramah dan penuh kasih sayang,
Natalia