LINUX.ORG.RU

exec в каталоге в котором находится файл

 , ,


0

1

Задача извлечь все архивы zip и rar, и упаковать это всё в 7z.

Если выполнять

find . -iname '*.zip' -exec unar -d {} \;

То архивы извлекают непосредственно в каталог из которого запущен find, а можно заставить find запускать unar в каталоге, в котором находится архив?

NAME
       unar - extract archive file contents
       
SYNOPSIS
       unar [OPTION]... ARCHIVE [FILE]...

DESCRIPTION
       Extract FILEs or the contents of ARCHIVE.

OPTIONS
       -o, -output-directory DIRECTORY
              The directory to write the contents of the archive to.  Defaults
              to the current directory.

i-rinat ★★★★★
()

То архивы извлекают непосредственно в каталог из которого запущен find, а можно заставить find запускать unar в каталоге, в котором находится архив?

лично я-бы написал скрипт типа такого

#!/bin/bash

DIRNAME=$(dirname "$1")
ARCNAME=$(basename "$1")

cd "$DIRNAME" || exit
unrar -x "$ARCNAME"
emulek
()
Ответ на: комментарий от steemandlinux

Только в аргументе путь к файлу, а не каталогу. Придется целый скрипт костылять.

о да, 5 строк мы ниасилили

emulek
()

Опция -execdir у find

anonymous
()
Ответ на: комментарий от steemandlinux

Теперь знаешь.

Можно даже отдельный файл для скрипта не задавать, а прямо так:

find . -name '*.zip' -exec sh -c 'unar -o `dirname {}` {}' \;

i-rinat ★★★★★
()
Последнее исправление: i-rinat (всего исправлений: 1)

можно заставить find запускать unar в каталоге, в котором находится архив?

Конечно: find . -iname '*.zip' -execdir unar -d {} \;.

dexpl ★★★★★
()
Ответ на: комментарий от steemandlinux

тащем-то есть ещё ${VALUE%/*} например. Работает почти как dirname. А вот ${VALUE##*/} почти как basename.

emulek
()
Ответ на: комментарий от emulek

не нужно

Вот так авторитетно, без каких бы то ни было доказательств или пояснений, просто мнение. Только вот авторитет ниже плинтуса. Как раз из-за такого поведения.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

хорошо, обоснуй нужность своего решения. Тебя не смущает, что в твоём решении тоже работает скрипт, вот только он записан не канонично в файле, а в строке, которая всё равно запускается через /bin/sh ?

emulek
()
Ответ на: комментарий от emulek

хорошо, обоснуй нужность своего решения

В команде сразу видно, что вообще происходит. Если это решение будет сохранено, оно лучше тем, что более читаемое: читателю не нужно искать упомянутый скрипт и смотреть в него. Если не будет, то оно лучше тем, что его проще написать: создал команду, запустил, и больше к ней не возвращаешься.

а в строке, которая всё равно запускается через /bin/sh

В этом вся суть. Содержимое строки видно в команде, а содержимое файла — нет.

i-rinat ★★★★★
()
Ответ на: комментарий от i-rinat

суть вот в чём:

Задача извлечь все архивы zip и rar, и упаковать это всё в 7z.

как ты будешь извлекать командой unar файлы rar и zip — я не очень понимаю, у меня вообще такой команды нет(есть «ar»).

Однако, как это сделать скриптом, я думаю очевидно.

Кроме того, скрипт полезен и сам по себе и в других похожих задачах.

emulek
()
Ответ на: комментарий от emulek

Хотя на автомате unar`ом я бы не стал rar`ы распаковывать, если бы не знал что rar архивы создавались очень давно и важных документов с вероятностью 99.9% там нет.

steemandlinux ★★★★★
() автор топика
# посмотреть
  find . -iname '*.zip' -printf "DIR='%h'; FILE='%f'\n"

# выполнить
  find . -iname '*.zip' -printf "cd '%h';  unrar '%f'; \n" | /bin/sh

sdio ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.