在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
接下来cd
Meta-.Meta-.您将需要/x
输入。
通过扩展来自Anderson M. Gomes的答案,Bash允许您通过键入~N
(或~+N
)N
dir堆栈中的位置来引用目录堆栈中的任何先前目录。例如:
# 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
,这些命令使用桌面环境剪贴板,并允许直观地复制/粘贴文件:ccut
cpaste
ccopy myfile
cd <second directory>
cpaste
使用桌面环境剪贴板时,复制/粘贴将与其他程序(例如文件管理器和IDE)中放置在剪贴板上的文件进行交互。至少它可以在类似Gnome的桌面上使用。
完全公开后,我放弃了在那找到类似的东西后写了剧本...
cd
命令,所以您可以cd -
返回上一个目录,向上箭头以调用该cd
命令,并将行编辑为cp
而不是cd
。(ctrl-a(行开头),alt-d(kill-word)cp -a
,ctrl-e(行末))。