在终端中一次提取多个文件

在终端中一次提取多个文件

我有一个包含数百个 zip 文件的目录。我希望能够选择大约五十个文件并使用终端中的unzip(或) 一次性提取所有文件。7z这些文件具有完全不同的名称,因此我无法使用正则表达式来匹配它们。

作为一个简化的示例,我有以下三个文件:

41a02d81b1c7b6225b11908c38b820cc.zip
d581697699c4321c32b733a9678.zip
ffb7077a319b2d168d5415b0f59a9e2ba3a.zip

我只想提取其中两个,而无需手动输入命令。

有没有办法使用 GUI 选择多个文件,然后将列表导出到 bash 以通过命令处理?

答案1

使用zsh、 shell 和 ,前提是您有:

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调整完成而获得的),然后您可以输入:

$ 代表 f (*.zipTab

此时,将列出zip当前目录中的文件,并让您使用箭头键和 来选择它们Enter

如果您不按 +Enter选择条目,而是按Alt+ A,它将插入当前条目,但也让您继续选择更多文件。

最后,file,按Enter即可完成命令,例如:

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

对于每个文件,会将其解压缩到具有相同名称但不带.zip扩展名的目录中(file1.zipin file1/file2.zipinfile2/等)。

答案2

zsh/ bash/ ksh93(或使用 GNU printf)中,你可以这样做:

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

vi(或您最喜欢的文本编辑器)中,删除您不想解压缩的文件的行。保存更改。然后运行:

zsh -x ./commands

(替换zsh为您最喜欢的 shell,最好是您运行命令的 shell printf)。


unzip 'file.zip'您也可以只存储文件,而不是将命令存储在该文件中:

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

并编辑它files

假设所有文件名都不包含换行符并且使用 GNU xargs

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.

答案3

您可以使用i选择为了这。给它一个列表(文件名或其他),它会在终端中弹出一个诅咒对话框,允许您选择一个或多个项目。

它返回选定项目的列表,您可以对它们执行您想要的操作。

多年来,我在脚本中多次使用它来完成与您类似的任务。

或者,午夜指挥官是一个全功能的文本模式文件浏览器,可让您导航目录(并“输入”zip 文件,即像目录一样导航它们),内置文件查看器和简单编辑器,并允许您选择文件( s) 与内置功能一起使用或作为参数传递给外部程序。

Midnight Commander 是众所周知的,并且适用于大多数(如果不是全部)发行版。 iselect有点晦涩难懂。在 Debian 上,它们分别打包为mciselect

答案4

这种事情正是 X 选择/粘贴约定的用途。

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 -

然后通过 shell 通过管道传输缓冲区。

相关内容