虽然可能是仅使用像 Midnight Commander 这样的文件管理器的好机会,但我想知道是否有一种优雅的方法可以从 shell 执行此操作:
假设我想将文件从一个目录复制到另一个目录。该目录很大,并且文件名又长又复杂,甚至部分神秘。我不知道确切的名称,只知道它包含penguin
.
我首先进行搜索
find . -iname "*penguin*" | less
我看一下结果:
./l1fe_of_Penguins ./Fw0rld_Of_penguins ./FUnNy_penguin
我想复制“有趣的企鹅”文件。然后我记住了复杂文件名的一些相关部分并在 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 -exec
optionfind
还可以执行命令,即:
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