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

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

有没有聪明的执行复制和移动操作或复制文件的命令的方法,而不必cdmv同一文件夹中执行?

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

mv /folder1/folder2/folder3/file.txt /folder1/folder2/folder3/file-2013.txt

请注意,我将文件移动到的目录是相同的,但我必须再次输入整个路径,有时这很烦人。我很好奇是否还有其他方法可以做到这一点而不必重新输入整个路径,因为操作将在同一路径中完成。

答案1

只需使用括号扩展

mv /folder1/folder2/folder3/{file.txt,file-2013.txt}

这相当于这样写:

mv /folder1/folder2/folder3/file.txt /folder1/folder2/folder3/file-2013.txt

当然,括号扩展允许您提供更多参数。您甚至可以将范围传递给它,例如,要创建几个测试文件夹,您可以运行mkdir test_{a..z},从 Bash 4 开始,您还可以创建零填充序列,例如touch foo{0001..3},这将创建foo0001foo0002foo0003Bash 黑客维基有一篇文章,其中提供了几个示例供您参考。

如果你必须使用两个不同的命令,请先使用子shell cd正如@Ignacio 的回答

答案2

在子 shell 中运行该操作。

( cd /folder1/folder2/folder3 && mv file.txt file-2013.txt )

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

答案3

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

mv /folder1/folder2/folder3/file.txt !#:1:h/file-2013.txt

我自己不会用这个,因为我发现它很难记住。我偶尔会用vim 等效项,但几乎每次都要查找它。

答案4

我喜欢其他的解决方案,但这里还有另一个,它是用 bash 数组、pushd、popd 的脚本实现的:

#!/bin/bash
set -e
# from http://stackoverflow.com/a/246128/178651
script_path="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"

# paths relative to the script
relative_paths=( \
path1 \
path2 \
path3 \
path4
)

for relative_path in "${relative_paths[@]}"
do
  pushd "$script_path/$relative_path" > /dev/null 2>&1
  pwd
  mv filename1 filename2
  # could do other stuff in this directory...
  popd > /dev/null 2>&1
done

pushd "$script_path" > /dev/null 2>&1
# could do other stuff in same directory as script...
popd > /dev/null 2>&1

相关内容