如何在另一个文件夹中执行命令,而不重复文件夹路径?

Val*_*lva 72 linux script bash shell command-line

有没有一种聪明的方法来执行复制和移动操作或命令来复制文件,而不必在同一文件夹中执行cd, 然后mv在之后?

例如,我必须运行以下命令:

mv /folder1/folder2/folder3/file.txt /folder1/folder2/folder3/file-2013.txt
Run Code Online (Sandbox Code Playgroud)

请注意,我将文件移动到的目录是相同的,但我必须再次放置整个路径,有时会很烦人。我很想知道是否有另一种方法可以做到这一点而不必再次放置整个路径,因为操作将在同一路径中完成。

slh*_*hck 124

只需使用大括号扩展

mv /folder1/folder2/folder3/{file.txt,file-2013.txt}
Run Code Online (Sandbox Code Playgroud)

这相当于写:

mv /folder1/folder2/folder3/file.txt /folder1/folder2/folder3/file-2013.txt
Run Code Online (Sandbox Code Playgroud)

当然,大括号扩展可以让您提供更多参数。你甚至可以通过范围到它,比如建立了几个测试文件夹,您可以运行mkdir test_{a..z},并开始猛砸4,您可以创建零填充序列以及,如touch foo{0001..3},创建foo0001foo0002foo0003。该击黑客维基有一对夫妇为你的例子的文章。

如果您必须使用两个不同的命令,cd请先使用子shell ,如@Ignacio's answer 中所示

  • 请注意,`file.txt,` 和 `file2.txt` 之间不应有空格。 (22认同)
  • 你可以让它更短,以防止在没有改变的部分出现拼写错误:`mv /folder1/folder2/folder3/file{,-2013}.txt` (9认同)
  • 我不知道`brace` 扩展,谢谢! (5认同)
  • 你确定你正在使用 Bash,就像在 `/bin/bash` 中一样,并且你不是在一个在 shebang 或其他一些不支持大括号扩展的 shell 中有 `/bin/sh` 的脚本中吗?如果你运行`set`,你的`SHELLOPTS` 是否包含`braceexpand`? (5认同)

Ign*_*ams 74

在子 shell 中运行该操作。

( cd /folder1/folder2/folder3 && mv file.txt file-2013.txt )
Run Code Online (Sandbox Code Playgroud)

工作目录的更改不会传播到父 shell。

  • +1:我喜欢那个,比括号扩展技巧更易于跨壳(它很整洁,但不太便携) (11认同)
  • @alexis Brace 扩展不是由 POSIX 指定的,因此“按设计”是不可移植的。`ash`、`dash`、`ksh​​88` 更不用说旧的 bo​​urne shell 是不支持它的 shell 的例子。 (5认同)
  • @Kaz 我关心 shell 命令的可移植性,它们是否交互并不重要。当然,您当然可以不关心这一点,但请接受人们不这么认为。您总是使用 bash 或支持 barce-expansion 的 shell 的事实并不意味着每个人都是这种情况。 (2认同)

gle*_*man 21

如果你想要聪明,这里是 bash历史扩展

mv /folder1/folder2/folder3/file.txt !#:1:h/file-2013.txt
Run Code Online (Sandbox Code Playgroud)

我自己不会使用这个,因为我发现它不可能记住。我偶尔会使用vim 等效项,但几乎每次都必须查找它。


sjb*_*tha 11

您可以设置一个变量。当然,这有留下变量的副作用。

D=/folder1/folder2/folder3; mv $D/file.txt $D/file-2013.txt
Run Code Online (Sandbox Code Playgroud)