有没有聪明的执行复制和移动操作或复制文件的命令的方法,而不必cd
在mv
同一文件夹中执行?
例如,我必须运行以下命令:
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}
,这将创建foo0001
,foo0002
和foo0003
。Bash 黑客维基有一篇文章,其中提供了几个示例供您参考。
如果你必须使用两个不同的命令,请先使用子shell cd
,正如@Ignacio 的回答。
答案2
在子 shell 中运行该操作。
( cd /folder1/folder2/folder3 && mv file.txt file-2013.txt )
工作目录的改变不会传播到父 shell。
答案3
答案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