我经常需要使用 或类似的方法有选择地归档一长串文件cp -iar
,为了加快这个过程,我想只按一个键,而不是按一个键,y
而不是在每个文件上n
按一个键。ENTER
换句话说,我想避免必须按ENTER
以及y
或n
。当然,我很乐意使用不同的键来代替y
或n
。
有没有办法做到这一点?
答案1
我认为你需要的是一个文件管理器,比如午夜指挥官。在mc中可以用insert或 + 来选择多个文件并对其进行删除、移动或复制等操作。完整的说明和提示可以在教程。
如果您尝试纯 shell 命令(无 GUI),假设您有 file0 到 file10,但只想复制 file1 和 file3:
cp file1 file3 directory/
当然,你可以使用 shell 来帮助自己:
cp file{1,3} directory/
但是连续的呢?文件 5 到文件 10?
cp file{5..10} directory/
如果您想要更高级的东西,您也可以使用find
to help,例如:
find Downloads -name "*.cfg" -exec cp {} directory \;
会这样做:
copy Downloads/file(6).cfg to directory
copy Downloads/file(7).cfg to directory
copy Downloads/file(1).cfg to directory
copy Downloads/file.cfg to directory
copy Downloads/file(2).cfg to directory
copy Downloads/file(4).cfg to directory
copy Downloads/file(3).cfg to directory
copy Downloads/file(5).cfg to directory
您可以验证要复制的文件,删除该-exec ...
部分。-exec echo cp ...
如果您想知道 find 的用途,也可以使用。
答案2
是的,可以,但是有点复杂。
在这里,我建议您使用这个 bash 脚本,将其保存到一个名为mycp.sh
要放入您的 PATH 中的文件中,并且不要忘记chmod +x mycp.
.显然它需要一些改进!
#!/bin/bash
[ $# -ne 2 ] && echo -en "ERROR : Need 2 parameters.\n" && exit
[ -f $1 ] && cp $1 $2
if [ -d $1 ]
then
mkdir -p $2
cd $1
find . | while read fn
do
if [ -f $fn ]
then
read -r -n1 yesorno
if [ "$yesorno" == "y" ] || [ "$yesorno" == "Y" ]
then
mkdir -p $2/`dirname $fn`
cp $fn $2/`dirname $fn`
fi
fi
done
fi
答案3
在这种情况下,如果我不想按后跟y
,Enter我会从上一行复制(Ctrl+ Shift+C在我的终端设置中)y
+ 换行符一次,然后在出现提示时粘贴(Ctrl+ Shift+ V)。
这不是一个按键,而是我可以一次性按下的按键,这对我来说已经足够了。在等待下一个提示时可以按住Ctrl+ 。Shift
答案4
基于read
Slyx 的调用,下面是一个简单的单行代码:
{ while read -r -n1 i; do echo >&2; echo $i; done } | cp -iar …
您必须在最后按Ctrl+才能退出循环。D到目前为止,我还没有找到在命令完成后退出循环的神奇方法;陷阱SIGCHLD
似乎并没有像我希望的那样起作用。如果将其保存到路径上调用的文件中yesorno
,则可以像这样编写:
#!/bin/bash
{ while read -r -n1 i; do echo >&2; echo $i; done } | "$@"
作为替代方案,您可以将其作为您的函数定义~/.bash_profile
:
yesorno() {
{ while read -r -n1 i; do echo >&2; echo $i; done } | "$@"
}
无论哪种情况,您都可以像这样调用它:
yesorno cp -iar …