我有一个包含数百个 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.zip
in file1/
、file2.zip
infile2/
等)。
答案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 上,它们分别打包为mc
和iselect
。
答案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 通过管道传输缓冲区。