Багато разів нам потрібно запускати скрипт для перетворення 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
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
Давайте подивимося, як поставити числовий префікс (поставити число в кінці, але перед звільненням) цей параметр дійсний, лише якщо у файлі є.
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
Як ви бачили, мета полягає в тому, щоб створити кішку файлу, який буде створений на початку рядка лише один раз, а потім буде видалений після завершення перетворення.
5- Інша утиліта - коли нам потрібно розпакувати кілька файлів, ущільнених у .zip
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "unzip -x "$0" "}' | sh
приклад
"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
На цих прикладах цілком ілюструється, як використовувати цю опцію для перетворення, модифікації або перейменування декількох файлів за допомогою одного сценарію, а не перетворення їх вручну один за одним. Споживання пам'яті за допомогою цієї опції мінімальне, залежно від використовуваної команди, оскільки вона перетворює їх не одночасно, а одну за одною.
ls --directory %F | sed 's/^/"/' | sed 's/$/"/' | awk '{print "script-convertir-video "$0" "}' | sh && zenity --info --text "Todas las conversiones han terminado"
FIN
Чи не буде це багато, але НАБАГАТО простіше зробити все це за допомогою регулярних виразів або символів підстановки? Я не розумію, яка різниця між цим і тим, що робить ваше життя таким складним із цим.
По правді кажучи, ви прекрасно знаєте команди Linux. Дуже корисний!
Так, я знаю, що ми тут з ним навчимось багато чого ха-ха-ха.
Я думаю, що це набагато простіше:
ls -d /path/to/folder/*.ext | під час читання файлу; виконайте КОМАНДУ "$ файл"; зроблено
Замість КОМАНДИ ви можете вставити все, що завгодно, і це працює, навіть якщо файли містять порожні пробіли, якщо ви вставите файл $ між лапками. Для цього не потрібно використовувати sed або генерувати команди за допомогою awk. Також це запускає менше процесів.
o:
для i в $ (ls -d /path/a/folder/*.ext); виконайте КОМАНДУ “$ i”; зроблено;
Це виглядає добре, але якщо імена файлів містять порожні місця, це не працює. 🙂
Насправді, hexborg, тому вихідний текст цитується на початку та в кінці для кожного рядка з цим параметром:
ls –директорія | sed 's / ^ / »/' | sed 's / $ / »/'
Я уточнюю, що find можна використовувати для пошуку в підкаталогах.
Але з моєю хитрістю вам не потрібно. ls виймає повні імена файлів по одному в кожному рядку, читає прочитані рядки за рядками та залишає ім'я файлу у змінній файлу, незалежно від того, чи має він порожні пробіли чи ні. Вам просто потрібно поставити лапки навколо файлу $ при використанні його в команді.
Я погоджуюсь, що в знаходженні це може бути менш громіздким. Візьмемо цей приклад зі статті:
ls --directory “$@” | sed 's/^/"/' | sed 's/$/"/' | awk '{print "pdftotext",$0}' | sh
Цього можна було б досягти таким чином, і це, швидше за все, працює швидше:
find . -type f -print0 | xargs -0 pdftotext
Тим не менш, стаття вітається, завжди добре дізнатися про альтернативні способи чогось зробити.
Якщо ви помітили, що $ i вказано в лапках. Це робить уникнення пробілів непотрібним.
Так, але оператор $ () розширює імена файлів, не ставлячи ніде лапки, тому змінна i вже ловить імена вирізаних файлів. Спробуйте в терміналі в каталозі, який містить файли з пробілами в іменах.
Дуже добре, складно, але дуже цікаво.
це дивно, чудово !!!!
Відмінно, пластичність GNU / Linux не має меж.
Шановний блогер,
Я Наталя, менеджер із комунікацій Paperblog. Після його виявлення я зв’язуюся з вами, щоб запросити вас ознайомитись із проектом Paperblog, http://es.paperblog.com, нова служба громадянської журналістики. Paperblog - це цифрова платформа, яка, подібно до журналу щоденників, публікує найкращі статті зареєстрованих блогів.
Якщо концепція вас цікавить, вам потрібно лише запропонувати свій блог для участі. На початку та в кінці кожного з них статті будуть супроводжуватися вашим ім’ям / псевдонімом та файлом профілю, а також кількома посиланнями на оригінальний блог. Команда може вибрати найцікавіші, які з’являться на Першій сторінці, і ви можете бути обраними Автором дня.
Сподіваюся, вас спонукає проект, який ми з таким ентузіазмом розпочали у січні 2010 року. Погляньте і не соромтеся писати мені для отримання детальної інформації.
Отримайте сердечне та ласкаве привітання,
Наталія