Если есть возможность изменить tar
, вызовите:
test -e myfile && myfile=myfile || myfile=
/bin/tar -cz data config $myfile 2>/dev/null |
С оболочкой 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/
и т. д. ).
В 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)
Чтобы заполнить массив $list
zip-файлами в текущем каталоге.
vared list
От до ed
если var
можно, удаляя записи, которые вы не хотите распаковывать. Затем:
for f ($list) unzip -d $f:r $f
Чтобы распаковать все файлы в $list
.
Для этого можно использовать iselect . Дайте ему список вещей (имен файлов или чего-то еще ), и он откроет диалоговое окно curses в вашем терминале, позволяющее вам выбрать один или несколько элементов.
Он возвращает список выбранных элементов, и вы можете делать с ними все, что хотите.
За прошедшие годы я несколько раз использовал его в сценариях для задач, подобных вашей.
В качестве альтернативы, Midnight Commander представляет собой полноценный -функциональный браузер файлов в текстовом -режиме, который позволяет перемещаться по каталогам (и «входить» в zip-файлы, т. е. перемещаться по ним, как если бы они каталог ), имеет встроенные средства просмотра файлов и простой редактор и позволяет вам выбирать файлы (с )для использования со встроенными -функциями или передавать их в качестве аргументов внешним программам.
Midnight Commander хорошо -известен и упакован для большинства, если не для всех, дистрибутивов. iselect
немного более неясен. В Debian они упакованы как mc
и iselect
соответственно.
Поскольку у вас есть терминал, естественным подходом будет просмотр каталога в режиме Emacs dired
(C-x d
). Затем вы можете выбрать файлы для работы с помощьюm
(или выбрать группу с помощью подстановочного знака с помощью% m
)и отменить выбор с помощью u
.
После того, как вы сделали свой выбор, вы можете запустить команду для выбранных файлов с помощью !
.
Это как раз то, для чего нужны соглашения 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 -
затем направить буфер через оболочку.
Большинство этих ответов безумны; если это один -, просто попробуйте вручную ввести имена файлов. В противном случае, если это постоянная необходимость, определите шаблон, напишите решение и контроль версий по мере развития ваших требований.
Вот каталог с некоторыми лог-файлами
~ $ 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. При необходимости повторите, но без наворотов и свистков.