Извлечь сразу несколько файлов в терминале

Если есть возможность изменить tar, вызовите:

test -e myfile && myfile=myfile || myfile=
/bin/tar -cz data config $myfile 2>/dev/null |
3
21.06.2021, 22:00
6 ответов

С оболочкой zshи при наличии:

setopt auto_menu autolist correct no_list_ambiguous
setopt list_types auto_pushd no_list_beep

zstyle ':completion:*' completer _expand _complete _ignored _correct _approximate _prefix
zstyle ':completion:*' format 'Completing %d'
zstyle ':completion:*' group-name ''
eval "$(dircolors)"
zstyle ':completion:*' list-colors ${(s.:.)LS_COLORS}
zstyle ':completion:*' matcher-list '' 'm:{a-z}={A-Z}' 'm:{a-zA-Z}={A-Za-z}' 'r:|[._-]=* r:|=* l:|=*'
zstyle ':completion:*' max-errors 1 not-numeric
zstyle ':completion:*' menu select=2
zstyle ':completion:*' original true
zstyle ':completion:*' prompt 'correct> '
zstyle ':completion:*' select-prompt '%SScrolling active: current selection at %p%s'
zstyle ':completion:*' verbose true
zstyle ':completion:*' menu select=2
autoload -Uz compinit
compinit -i

в вашем~/.zshrc(примечании, что не все из них уместны здесь; и были получены в результате запуска compinstallдля завершения настройки ), то можно набрать:

$ for f (*.zipTab

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

Если вместо нажатия Enter для выбора записи вы нажмете Alt + A , будет вставлена ​​текущая запись, но вы также сможете продолжить выбор больше файлов.

В последнем файле нажмите Enter и затем вы можете закончить команду, такую ​​как:

for f (file1.zip file2.zip) unzip -d $f:r $f

Который для каждого файла распаковывает его в каталог с тем же именем, но без расширения .zip(file1.zipв file1/, file2.zipв file2/и т. д. ).

5
28.07.2021, 11:23

В zsh/ bash/ksh93(или с GNUprintf)вы можете сделать:

$ printf 'unzip %q\n'./*.zip > commands
$ vi commands

И вvi(или в вашем любимом текстовом редакторе )удалите строки для файлов, которые вы не хотите распаковывать. Сохраните изменения. Затем запустите:

zsh -x./commands

(замените zshвашей любимой оболочкой, предпочтительно той, которую вы запускали командой printfиз ).


Вместо сохранения unzip 'file.zip'команд в этом файле вы также можете хранить только файлы:

printf '%s\n'./*.zip > files

и отредактируйте files.

И если ни одно из имен файлов не содержит символов новой строки и с GNUxargs:

xargs -d '\n' -tr0a files -n1 unzip

, чтобы разархивировать их.


Аналогичный подход с zsh заключается в том, чтобы сделать что-то подобное, но вместо редактирования файла,вы редактируете переменную с помощью varedвстроенного:

list=(*.zip)

Чтобы заполнить массив $listzip-файлами в текущем каталоге.

vared list
От

до edесли varможно, удаляя записи, которые вы не хотите распаковывать. Затем:

for f ($list) unzip -d $f:r $f

Чтобы распаковать все файлы в $list.

5
28.07.2021, 11:23

Для этого можно использовать iselect . Дайте ему список вещей (имен файлов или чего-то еще ), и он откроет диалоговое окно curses в вашем терминале, позволяющее вам выбрать один или несколько элементов.

Он возвращает список выбранных элементов, и вы можете делать с ними все, что хотите.

За прошедшие годы я несколько раз использовал его в сценариях для задач, подобных вашей.

В качестве альтернативы, Midnight Commander представляет собой полноценный -функциональный браузер файлов в текстовом -режиме, который позволяет перемещаться по каталогам (и «входить» в zip-файлы, т. е. перемещаться по ним, как если бы они каталог ), имеет встроенные средства просмотра файлов и простой редактор и позволяет вам выбирать файлы (с )для использования со встроенными -функциями или передавать их в качестве аргументов внешним программам.

Midnight Commander хорошо -известен и упакован для большинства, если не для всех, дистрибутивов. iselectнемного более неясен. В Debian они упакованы как mcи iselectсоответственно.

4
28.07.2021, 11:23

Поскольку у вас есть терминал, естественным подходом будет просмотр каталога в режиме Emacs dired(C-x d). Затем вы можете выбрать файлы для работы с помощьюm(или выбрать группу с помощью подстановочного знака с помощью% m)и отменить выбор с помощью u.

После того, как вы сделали свой выбор, вы можете запустить команду для выбранных файлов с помощью !.

2
28.07.2021, 11:23

Это как раз то, для чего нужны соглашения X select/paste.

find that/dir; while read; do whatever with $REPLY; done

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

Или вы можете запустить любой достойный редактор, у emacs есть встроенный dired, у vim есть встроенный netrw, и пометить нужные файлы, а затем делать с помеченными файлами что угодно.

Или вы можете сгенерировать все команды в файл и отредактировать те, которые вам не нужны:

find that/dir -iname \*.zip -printf '7z x %p\n' | vim -R -

затем направить буфер через оболочку.

1
28.07.2021, 11:23

Большинство этих ответов безумны; если это один -, просто попробуйте вручную ввести имена файлов. В противном случае, если это постоянная необходимость, определите шаблон, напишите решение и контроль версий по мере развития ваших требований.

Вот каталог с некоторыми лог-файлами

~ $ ls /var/log | wc -l
46

Меня интересуют только журналы wifiи systemдля некоторых ежедневных сводных данных.

~ $ ls /var/log/system* /var/log/wifi* | wc -l
22

Создайте стратегию «Ежедневный совокупный вздор» и зафиксируйте (не показано ).

$ ls /var/log/system* /var/log/wifi* | wc -l
22
~ $ mkdir /tmp/selectstrategies
~ $ pushd /tmp/selectstrategies/
/tmp/selectstrategies ~
/tmp/selectstrategies $ printf "%s\n" "/var/log/system*" "/var/log/wifi*" | tee /dev/stderr >StrategyDailyAggregrate
/var/log/system*
/var/log/wifi*

Напишите небольшой служебный скрипт для выполнения любой задачи с использованием файла стратегии и зафиксируйте в репозитории (не показано ).

$ cat./select.sh 
#!/bin/sh
set -eu

<$1 xargs -t  sh -c 'ls $@' -

Выполнить

$./select.sh StrategyDailyAggregrate 
sh -c 'ls $@' - '/var/log/system*' '/var/log/wifi*'
/var/log/system.log             /var/log/wifi.log.0.bz2
...

Это не пришло мне в голову, но вы поняли суть; если вам нужно индивидуальное решение, просто напишите простой, грязный и быстрый mvp. При необходимости повторите, но без наворотов и свистков.

0
28.07.2021, 11:23

Теги

Похожие вопросы