Як використовувати команди, які працюють лише з одним файлом одночасно з усіма вибраними файлами

Багато разів нам потрібно запускати скрипт для перетворення pdf у текст, перетворення файлів .doc у html тощо; суть у тому, що ці команди приймають лише по одному файлу за раз, і це дуже нудно для нас, якщо нам потрібно виконати одне і те ж завдання над кількома файлами, особливо коли ми робимо сценарій.

Я пропоную вирішити цю проблему за допомогою ls, sed, GREP, awk y sh. Що ми будемо робити, це створити правильний командний рядок у кожному рядку і виконати їх за допомогою sh, а оскільки sh буде виконувати по одному рядку за раз, споживання оперативної пам'яті не збільшиться, що за допомогою інших методів може навіть заморозити недостатньо потужні машини.

Давайте подивимося, як виконати цю послідовність команд.

1- Перше, що нам потрібно зробити, це представити файли, які будуть використовуватися через ls:

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

2- Тоді нам будуть потрібні ці файли для передачі цитат «/ шлях / до групи
файлів«

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

3- Зараз awk він буде готовий отримати дані.

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

Тому що awk має свою власну мову, нам потрібно буде відокремити лапки, які ми хочемо показати для цитування тексту, серед інших функцій, які нам знадобляться для використання зворотної риски \ Давайте подивимося, як відокремити деякі.
Окрема цитата

\”

Покажіть зворотну косу риску у виведенні (нам потрібно буде ввести три смуги)

\\\

Іноді нам знадобиться відокремлюючий роздільник, на виході буде виводитись лише текст або лапки, які з’являються в двох зворотних скісних рисках:

'""'\"\'""'

4- Давайте подивимося, як перейменувати всі файли, перелічені за допомогою команди mv просто для введення суфікса. (Тепер для перерахування файлу нам потрібно буде використовувати комбінацію "$ 0" щоразу, коли нам потрібно буде його використовувати)

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

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

Примітка додається в кінці, як показано в попередній послідовності комбінація « | ш »Що перенаправляє конвеєр до цього інтерпретатора команд

Давайте подивимося кілька прикладів, підготовлених для створення сценарію.

Приклади:

1- Перетворіть усі PDF-файли, перелічені в текстові файли.

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

У цьому випадку не потрібно вибирати вихідний файл, оскільки pdftotext автоматично генерує текстовий файл із базовим ім'ям та звільненням .txt тоді і лише тоді, коли ви працюєте з одним файлом.

2- Скажімо, ми хочемо застосувати ефект до зображення, але не змінюючи оригінал, давайте подивимось приклад з хвильовим ефектом, добре відомим під логотипом Windows XP, оскільки це прапор з хвилястими ефектами (щоб краще оцінити цей ефект, це рекомендується використовувати як отримане зображення з розширенням .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

Примітка: кілька проходів зроблено в такій послідовності:

  • Один, щоб отримати папку, в якій знаходиться файл з іменем dirname
  • Ще одне для отримання базового імені, але видалення розширення згаданого файлу
  • Інший для отримання звільнення від зазначеної справи.

3- Давайте тепер подивимося, як перейменувати групу файлів, поставивши відповідний номер перед іменем (числовий суфікс).

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

Для введення номера була використана внутрішня мова awk з опцією "FNR", яка перелічує кожен рядок результату, тому номер може бути розміщений до тексту або після нього.

Давайте подивимося, як поставити числовий префікс (поставити число в кінці, але перед звільненням) цей параметр дійсний, лише якщо у файлі є.

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- Давайте подивимось приклад, коли нам доведеться вводити дані або вибирати групу функцій, взявши за приклад випадок, коли ми видаляємо захист паролем з декількох PDF-файлів, що мають однаковий пароль. (У цьому випадку ми будемо використовувати zenity як діалогове вікно)

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

Залежно від версії zenity опція для пароля може бути просто –паролем.

Як ви бачили, мета полягає в тому, щоб створити кішку файлу, який буде створений на початку рядка лише один раз, а потім буде видалений після завершення перетворення.

5- Інша утиліта - коли нам потрібно розпакувати кілька файлів, ущільнених у .zip

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

Зайві лапки повинні бути розділені пробілом, де використовується опція "$ 0".
приклад
"unzip -x "$0" "

6- Давайте подивимось приклад захисту PDF за допомогою пароля, що дозволяє читати, але захищено від друку копію чи інші параметри, (параметри, перелічені в діалоговому вікні, будуть тими, які будуть дозволені в pdf, якщо ви не хочете дозволити будь-який з них не вибирайте жодного).

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

На цих прикладах цілком ілюструється, як використовувати цю опцію для перетворення, модифікації або перейменування декількох файлів за допомогою одного сценарію, а не перетворення їх вручну один за одним. Споживання пам'яті за допомогою цієї опції мінімальне, залежно від використовуваної команди, оскільки вона перетворює їх не одночасно, а одну за одною.

Цей параметр може бути дуже корисним, якщо ми хочемо перетворити цілу групу відео за допомогою mencoder, не приєднуючи їх до одного; Ви можете підготувати сценарій для цього, і їх просто потрібно було б поставити ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"

FIN


Залиште свій коментар

Ваша електронна адреса не буде опублікований. Обов'язкові для заповнення поля позначені *

*

*

  1. Відповідальний за дані: Мігель Анхель Гатон
  2. Призначення даних: Контроль спаму, управління коментарями.
  3. Легітимація: Ваша згода
  4. Передача даних: Дані не передаватимуться третім особам, за винятком юридичних зобов’язань.
  5. Зберігання даних: База даних, розміщена в мережі Occentus Networks (ЄС)
  6. Права: Ви можете будь-коли обмежити, відновити та видалити свою інформацію.

  1.   Раміро - сказав він

    Чи не буде це багато, але НАБАГАТО простіше зробити все це за допомогою регулярних виразів або символів підстановки? Я не розумію, яка різниця між цим і тим, що робить ваше життя таким складним із цим.

  2.   крото - сказав він

    По правді кажучи, ви прекрасно знаєте команди Linux. Дуже корисний!

    1.    KZKG ^ Гаара - сказав він

      Так, я знаю, що ми тут з ним навчимось багато чого ха-ха-ха.

  3.   гексборг - сказав він

    Я думаю, що це набагато простіше:

    ls -d /path/to/folder/*.ext | під час читання файлу; виконайте КОМАНДУ "$ файл"; зроблено

    Замість КОМАНДИ ви можете вставити все, що завгодно, і це працює, навіть якщо файли містять порожні пробіли, якщо ви вставите файл $ між лапками. Для цього не потрібно використовувати sed або генерувати команди за допомогою awk. Також це запускає менше процесів.

    1.    Анх - сказав він

      o:
      для i в $ (ls -d /path/a/folder/*.ext); виконайте КОМАНДУ “$ i”; зроблено;

      1.    гексборг - сказав він

        Це виглядає добре, але якщо імена файлів містять порожні місця, це не працює. 🙂

        1.    тахед - сказав він

          Насправді, hexborg, тому вихідний текст цитується на початку та в кінці для кожного рядка з цим параметром:
          ls –директорія | sed 's / ^ / »/' | sed 's / $ / »/'

          Я уточнюю, що find можна використовувати для пошуку в підкаталогах.

          1.    гексборг - сказав він

            Але з моєю хитрістю вам не потрібно. ls виймає повні імена файлів по одному в кожному рядку, читає прочитані рядки за рядками та залишає ім'я файлу у змінній файлу, незалежно від того, чи має він порожні пробіли чи ні. Вам просто потрібно поставити лапки навколо файлу $ при використанні його в команді.

          2.    Хьюго - сказав він

            Я погоджуюсь, що в знаходженні це може бути менш громіздким. Візьмемо цей приклад зі статті:

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

            Цього можна було б досягти таким чином, і це, швидше за все, працює швидше:

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

            Тим не менш, стаття вітається, завжди добре дізнатися про альтернативні способи чогось зробити.

        2.    Анх - сказав він

          Якщо ви помітили, що $ i вказано в лапках. Це робить уникнення пробілів непотрібним.

          1.    гексборг - сказав він

            Так, але оператор $ () розширює імена файлів, не ставлячи ніде лапки, тому змінна i вже ловить імена вирізаних файлів. Спробуйте в терміналі в каталозі, який містить файли з пробілами в іменах.

  4.   Лев - сказав він

    Дуже добре, складно, але дуже цікаво.

  5.   helena_ryuu - сказав він

    це дивно, чудово !!!!

  6.   MSX - сказав він

    Відмінно, пластичність GNU / Linux не має меж.

  7.   Наталія - сказав він

    Шановний блогер,

    Я Наталя, менеджер із комунікацій Paperblog. Після його виявлення я зв’язуюся з вами, щоб запросити вас ознайомитись із проектом Paperblog, http://es.paperblog.com, нова служба громадянської журналістики. Paperblog - це цифрова платформа, яка, подібно до журналу щоденників, публікує найкращі статті зареєстрованих блогів.

    Якщо концепція вас цікавить, вам потрібно лише запропонувати свій блог для участі. На початку та в кінці кожного з них статті будуть супроводжуватися вашим ім’ям / псевдонімом та файлом профілю, а також кількома посиланнями на оригінальний блог. Команда може вибрати найцікавіші, які з’являться на Першій сторінці, і ви можете бути обраними Автором дня.

    Сподіваюся, вас спонукає проект, який ми з таким ентузіазмом розпочали у січні 2010 року. Погляньте і не соромтеся писати мені для отримання детальної інформації.

    Отримайте сердечне та ласкаве привітання,
    Наталія