“挑选”文件以进行进一步处理

“挑选”文件以进行进一步处理

虽然可能是仅使用像 Midnight Commander 这样的文件管理器的好机会,但我想知道是否有一种优雅的方法可以从 shell 执行此操作:

假设我想将文件从一个目录复制到另一个目录。该目录很大,并且文件名又长又复杂,甚至部分神秘。我不知道确切的名称,只知道它包含penguin.

  1. 我首先进行搜索find . -iname "*penguin*" | less

  2. 我看一下结果:

    ./l1fe_of_Penguins
    ./Fw0rld_Of_penguins
    ./FUnNy_penguin
    
  3. 我想复制“有趣的企鹅”文件。然后我记住了复杂文件名的一些相关部分并在 shell 命令中输入,例如

    cp FUn*penguin /media/share
    

我怎样才能让它更快?如何在全文本模式下从搜索结果中获取文件名作为命令行参数?

答案1

您可以使用 TAB 键自动完成大多数 shell 的文件系统路径。

bash 支持这个以及更多。

然而,我遇到过的最具交互性的 shell 是 zsh,它有一个自定义的配置文件,例如grml 的 zsh 配置哦我的zsh

使用 zsh,您可以使用 glob 进行自动完成,甚至可以一次完成多个文件。

在不知道您使用的是哪种类型的 Unix 或 Linux 的情况下,我能告诉您的最好的办法就是检查您的软件存储库或自己编译 zsh。

由于您提到了企鹅,假设使用的是 Linux,请与您的包管理器检查以下内容:

zsh

对于高级 rc 文件,可以支持 shell 中的许多很酷的东西

grml-zsh-config
oh-my-zsh

答案2

我找到了一种方法来做到这一点:

find . -iname "*penguin*" | pick | xargs -J % cp -i % /media/share

答案3

using -execoptionfind还可以执行命令,即:

find . -iname "*penguin*" -exec cp {} /media/share \;

其中{}被名称替换。

顺便提一句。man find是很棒的! :)

答案4

你可以试试这个。

一旦您对输出感到满意,请删除 echo 命令

find . -iname "*penguin*" | awk '/penguin$/' | while read filename
do
    echo "cp ${filename} /media/share"
done

相关内容