在Bash中,假设我访问一个目录,然后访问另一个目录。我想将文件从第一个目录复制到第二个目录,但不指定它们的长路径名。可能吗?
我的临时解决方案是/tmp用作存储文件副本的临时位置。cp myfile /tmp当我在第一个目录中时,然后cp /tmp/myfile .当我在第二个目录中时。但是我可以检查文件是否会覆盖中的任何内容/tmp。
是否有类似于剪贴板的用于复制和粘贴文件的内容?
M-x term您可以使用Emacs的剪贴板。
在Bash中,假设我访问一个目录,然后访问另一个目录。我想将文件从第一个目录复制到第二个目录,但不指定它们的长路径名。可能吗?
我的临时解决方案是/tmp用作存储文件副本的临时位置。cp myfile /tmp当我在第一个目录中时,然后cp /tmp/myfile .当我在第二个目录中时。但是我可以检查文件是否会覆盖中的任何内容/tmp。
是否有类似于剪贴板的用于复制和粘贴文件的内容?
M-x term您可以使用Emacs的剪贴板。
Answers:
使用Bash,我只需访问以下目录:
$ cd /path/to/source/directory
$ cd /path/to/destination/directory
然后,我将使用快捷方式~-,它指向上一个目录:
$ cp -v ~-/file1.txt .
$ cp -v ~-/file2.txt .
$ cp -v ~-/file3.txt .
如果要以相反的顺序访问目录,则:
$ cp -v fileA.txt ~-
$ cp -v fileB.txt ~-
$ cp -v fileC.txt ~-
"$OLDPWD"。为什么要使用三个单独的cp命令? cp -a ~-/file[1-3].txt .
cp是示例。在现实世界中,通配符也可以用来简化复制任务。
pushd和解析的事情dirs……但这远远好得多。我建议您添加一个事实,该事实"$OLDPWD"完全等效~-且更便于移植(对那些不使用bash。的用户有所帮助)
~+同样是"$PWD"
如果我看到这种情况是一次性的,我可能会:
a=`pwd`
cd /somewhere/else
cp "$a/myfile" .
如果有目录我发现自己不定期复制文件,则可能会在.profile中为它们定义一些助记符变量。
睡在它上面之后,我想知道我能与其他GUI / OS行为有多近的距离,在这里您可以选择一些文件,然后将它们“剪切”或“复制”,然后将它们“粘贴”到其他位置。我能想到的最佳选择机制是您的大脑/首选项以及外壳的globbing功能。我在命名方面不是很有创造力,但这是基本思想(使用Bash语法):
function copyfiles {
_copypastefiles=("$@")
_copypastesrc="$PWD"
_copypastemode=copy
}
function cutfiles {
_copypastefiles=("$@")
_copypastesrc="$PWD"
_copypastemode=cut
}
function pastefiles {
for f in "${_copypastefiles[@]}"
do
cp "${_copypastesrc}/$f" .
if [[ ${_copypastemode} = "cut" ]]
then
rm "${_copypastesrc}/$f"
fi
done
}
要使用它,请将代码放入〜/ .bash_profile,然后放入cd源目录并运行copyfiles glob*here或cutfiles glob*here。发生的所有事情是您的shell扩展了glob,并将这些文件名放入数组中。然后cd,您到达目标目录并运行pastefiles,该目录cp为每个源文件执行一个命令。如果您以前曾“剪切”文件,则pastefiles也会删除源文件(或尝试删除)。这不会对现有文件进行任何错误检查(在可能之前用cp; 破坏现有文件之前;或者您具有在“剪切”期间删除文件的权限;或者在移出后可以重新访问源目录)的)。
$OLDPWD已经存在,可以将其缩短为~-bash和zsh。
我认为这~-是正确的答案,但请注意,bash具有内置的行编辑器,可以复制/粘贴文本。
如果你在emacs模式,你可以回想一下你cd从历史的命令,并使用Control-u以杀行成bash的“剪贴板”叫杀环(还有其他的方式太)。然后,您可以抽出随时与此字符串转换成一个新的命令Control-y。显然,在您的示例中,这取决于您在cd命令中使用了绝对目录名称。
您还可以使用有趣的默认键绑定Meta-.。这会将上一个命令的最后一个单词复制到您的当前行中。如果重复,则每次返回历史记录中的一个命令。因此,如果您执行cd /x,那么cd /y接下来cdMeta-.Meta-.您将需要/x输入。
通过扩展来自Anderson M. Gomes的答案,Bash允许您通过键入~N(或~+N)Ndir堆栈中的位置来引用目录堆栈中的任何先前目录。例如:
# go some places
$ cd /path/to/source/directory
$ pushd /path/to/destination/directory
$ pushd $HOME
$ pushd /tmp
# show the current dir stack
$ dirs -v
0 /tmp
1 ~
2 /path/to/destination/directory
3 /path/to/source/directory
现在,您可以使用以下命令在两个过去的目录之间复制文件,而这两个目录都不是当前目录:
cp -v ~3/file1.txt ~2
要解决原始海报的问题,您可以执行以下操作:
$ cd /path/to/source/directory
$ pushd /path/to/destination/directory
# show the current dir stack
$ dirs -v
0 /path/to/destination/directory
1 /path/to/source/directory
# copy
cp -v ~1/file[123].txt .
对于大量文件,您可以在清单文件中列出它们的名称,然后从源目录进行复制:
$ cd /path/to/destination/directory
$ pushd /path/to/source/directory
# copy
cp -v $(cat files_to_copy.list) ~1
另请参见:Bash手册页的此部分
同样,在Tcsh中,您可以使用=2表示法(而不是~2)来引用目录堆栈中的第二个目录。
另请参见:Tcsh手册页的本部分
当您在第一个目录中时,假设源代码或src简而言之,执行
src=${PWD}
然后cd进入第二个目录并执行:
cp -i ${src}/filename .
该-i选项将询问您是否要覆盖,是否存在重复文件
Anderson-m-Gomes回应的一种变体。使用Bash,我只需访问以下目录:
$ cd /path/to/source/directory
$ cd /path/to/destination/directory
然后,我将使用变量$ OLDPWD,它指向先前的目录:
$ cp -v $OLDPWD/file1.txt .
如果要以相反的顺序访问目录,则:
$ cp -v fileA.txt $OLDPWD/
$OLDPWD包含空格,则会中断。另外,我总是使用cp -a。同样,不幸的是,变量扩展不能使制表符完成。但是,在键入$ OLDPWD部分之后,您可以使用ctrl-alt-e对当前命令行进行shell扩展。
~-是捷径$OLDPWD
您可以使用xclip:
NAME
xclip - command line interface to X selections (clipboard)
SYNOPSIS
xclip [OPTION] [FILE]...
DESCRIPTION
Reads from standard in, or from one or more files, and makes the data available as an X selection for pasting
into X applications. Prints current X selection to standard out.
例:
$ cd /path/to/dir1
$ xclip-copyfile file1 file2
$ cd /path/to/dir2
$ xclip-pastefile
file1 file2
另请访问xsel。
tar | gzip进出X剪贴板。与相比cp,Kinda笨拙,并且不能一概而论地建立符号链接或硬链接。(cp -as或cp -al)
您可以在clipboard-files此处签出脚本:https : //github.com/larspontoppidan/clipboard-files
它提供诸如和的命令ccopy,这些命令使用桌面环境剪贴板,并允许直观地复制/粘贴文件:ccutcpaste
ccopy myfile
cd <second directory>
cpaste
使用桌面环境剪贴板时,复制/粘贴将与其他程序(例如文件管理器和IDE)中放置在剪贴板上的文件进行交互。至少它可以在类似Gnome的桌面上使用。
完全公开后,我放弃了在那找到类似的东西后写了剧本...
cd命令,所以您可以cd -返回上一个目录,向上箭头以调用该cd命令,并将行编辑为cp而不是cd。(ctrl-a(行开头),alt-d(kill-word)cp -a,ctrl-e(行末))。