所以,如果我在我的主目录下,我想把foo.c移动到~/bar/baz/foo.c,但是这些目录不存在,有没有什么方法可以自动创建这些目录,这样你只需要输入
mv foo.c ~/bar/baz/
一切都会解决的吗?似乎可以将mv别名为一个简单的bash脚本,该脚本将检查这些目录是否存在,如果不存在,将调用mkdir,然后调用mv,但我想检查一下,看看是否有人有更好的主意。
所以,如果我在我的主目录下,我想把foo.c移动到~/bar/baz/foo.c,但是这些目录不存在,有没有什么方法可以自动创建这些目录,这样你只需要输入
mv foo.c ~/bar/baz/
一切都会解决的吗?似乎可以将mv别名为一个简单的bash脚本,该脚本将检查这些目录是否存在,如果不存在,将调用mkdir,然后调用mv,但我想检查一下,看看是否有人有更好的主意。
当前回答
代码:
if [[ -e $1 && ! -e $2 ]]; then
mkdir --parents --verbose -- "$(dirname -- "$2")"
fi
mv --verbose -- "$1" "$2"
例子:
参数:"d1" "d2/sub"
mkdir: created directory 'd2'
renamed 'd1' -> 'd2/sub'
其他回答
最简单的方法是:
mkdir [directory name] && mv [filename] $_
让我们假设我下载了位于我的下载目录(~/download)中的pdf文件,我想将它们全部移动到一个不存在的目录(比如my_PDF)。
我将输入以下命令(确保我当前的工作目录是~/download):
mkdir my_PDF && mv *.pdf $_
如果你想创建子目录,你可以在mkdir中添加-p选项,就像这样(假设我想创建一个名为python的子目录):
mkdir -p my_PDF/python && mv *.pdf $_
根据另一个答案的注释,这是我的shell函数。
# mvp = move + create parents
function mvp () {
source="$1"
target="$2"
target_dir="$(dirname "$target")"
mkdir --parents $target_dir; mv $source $target
}
将它包含在.bashrc或类似文件中,这样你就可以在任何地方使用它。
你甚至可以使用大括号扩展:
mkdir -p directory{1..3}/subdirectory{1..3}/subsubdirectory{1..2}
创建3个目录(directory1, directory2, directory3), 每个目录中都有两个子目录(subdirectory1, subdirectory2), 每个目录中都有两个子目录(subsubdirectory1和subsubdirectory2)。
您必须使用bash 3.0或更新版本。
下面的一行代码怎么样(在bash中):
mkdir --parents ./some/path/; mv yourfile.txt $_
分解一下:
mkdir --parents ./some/path
# if it doesn't work; try
mkdir -p ./some/path
创建目录(包括所有中间目录),之后:
mv yourfile.txt $_
将文件移动到该目录($_扩展为传递给上一个shell命令的最后一个参数,即:新创建的目录)。
我不确定这在其他shell中工作到什么程度,但它可能会给您一些关于寻找什么的想法。
下面是一个使用该技术的例子:
$ > ls
$ > touch yourfile.txt
$ > ls
yourfile.txt
$ > mkdir --parents ./some/path/; mv yourfile.txt $_
$ > ls -F
some/
$ > ls some/path/
yourfile.txt
对于这个问题,有很多相互矛盾的解决方案,以下是对我们有效的解决方案:
## ss_mv ##
function ss_mv {
mkdir -p $(dirname "$2") && mv -f "$@"
}
这里假设命令的语法如下:
ss_mv /var/www/myfile /var/www/newdir/myfile
通过这种方式,从命令的第二部分提取目录路径/var/www/newdir,然后创建新目录(使用dirname标记以避免将myfile添加到正在创建的新目录中是很关键的)。
然后我们继续使用“$@”标记对整个字符串再次进行mv。