Cara menggunakan perintah yang hanya bekerja dengan satu file pada satu waktu dengan semua file yang Anda pilih

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

Dalam kasus ini, tidak perlu memilih file keluaran karena pdftotext secara otomatis menghasilkan file teks dengan nama dasar dan pengecualian .txt jika dan hanya jika Anda bekerja dengan satu file.

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

Untuk memasukkan nomor, bahasa awk internal digunakan dengan opsi "FNR" yang mencantumkan setiap baris keluaran, sehingga nomor dapat ditempatkan sebelum atau sesudah teks.

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

Bergantung pada versi zenity, opsi untuk kata sandi bisa hanya –pasukan.

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

Kutipan ekstra harus dipisahkan dengan spasi di mana opsi "$ 0" digunakan.
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.

Pilihan ini bisa sangat berguna jika kita ingin mengonversi seluruh grup video dengan mencoder tanpa menggabungkannya menjadi satu; Anda dapat menyiapkan skrip untuk ini dan mereka hanya harus meletakkan ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"

FIN


tinggalkan Komentar Anda

Alamat email Anda tidak akan dipublikasikan. Bidang yang harus diisi ditandai dengan *

*

*

  1. Penanggung jawab data: Miguel Ángel Gatón
  2. Tujuan data: Mengontrol SPAM, manajemen komentar.
  3. Legitimasi: Persetujuan Anda
  4. Komunikasi data: Data tidak akan dikomunikasikan kepada pihak ketiga kecuali dengan kewajiban hukum.
  5. Penyimpanan data: Basis data dihosting oleh Occentus Networks (UE)
  6. Hak: Anda dapat membatasi, memulihkan, dan menghapus informasi Anda kapan saja.

  1.   Ramiro dijo

    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.

  2.   kroto dijo

    Sebenarnya, Anda memiliki pengetahuan yang bagus tentang perintah linux. Sangat berguna!

    1.    KZKG ^ Gaara dijo

      Ya, saya tahu kita akan belajar banyak dengannya di sekitar sini hahaha.

  3.   hexborg dijo

    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.

    1.    ankh dijo

      o:
      untuk saya di $ (ls -d /path/a/folder/*.ext); lakukan PERINTAH “$ i”; selesai;

      1.    hexborg dijo

        Itu terlihat bagus, tetapi jika nama file berisi kosong itu tidak berfungsi. 🙂

        1.    taed dijo

          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.

          1.    hexborg dijo

            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.

          2.    Hugo dijo

            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.

        2.    ankh dijo

          Jika Anda memperhatikan $ i dalam tanda kutip. Itu membuat pelolosan spasi tidak diperlukan.

          1.    hexborg dijo

            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.

  4.   Leo dijo

    Sangat bagus, kompleks, tapi sangat menarik.

  5.   helena_ryuu dijo

    ini luar biasa, hebat !!!!

  6.   MSX dijo

    Luar biasa, plastisitas GNU / Linux tidak memiliki batasan.

  7.   Natalia dijo

    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