所以,如果我在我的主目录下,我想把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,但我想检查一下,看看是否有人有更好的主意。
当前回答
利用“将最后一个参数传递给shell脚本”中的技巧,我们可以创建一个简单的shell函数,无论你想移动多少个文件都能正常工作:
# Bash only
mvdir() { mkdir -p "${@: -1}" && mv "$@"; }
# Other shells may need to search for the last argument
mvdir() { for last; do true; done; mkdir -p "$last" && mv "$@"; }
使用如下命令:
mvdir foo.c foo.h ~/some/new/folder/
其他回答
你甚至可以使用大括号扩展:
mkdir -p directory{1..3}/subdirectory{1..3}/subsubdirectory{1..2}
创建3个目录(directory1, directory2, directory3), 每个目录中都有两个子目录(subdirectory1, subdirectory2), 每个目录中都有两个子目录(subsubdirectory1和subsubdirectory2)。
您必须使用bash 3.0或更新版本。
我的解决方案是:
test -d "/home/newdir/" || mkdir -p "/home/newdir/" && mv /home/test.txt /home/newdir/
下面的一行代码怎么样(在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
在将文件批量移动到新的子目录时,我经常遇到这个问题。理想情况下,我想这样做:
mv * newdir/
这个线程中的大多数答案都建议mkdir然后mv,但这导致:
mkdir newdir && mv * newdir
mv: cannot move 'newdir/' to a subdirectory of itself
我面临的问题略有不同,因为我想全面移动所有内容,并且,如果我在移动之前创建了新目录,那么它也会尝试将新目录移动到自己。所以,我通过使用父目录来解决这个问题:
mkdir ../newdir && mv * ../newdir && mv ../newdir .
警告:不能在根文件夹(/)中工作。
利用“将最后一个参数传递给shell脚本”中的技巧,我们可以创建一个简单的shell函数,无论你想移动多少个文件都能正常工作:
# Bash only
mvdir() { mkdir -p "${@: -1}" && mv "$@"; }
# Other shells may need to search for the last argument
mvdir() { for last; do true; done; mkdir -p "$last" && mv "$@"; }
使用如下命令:
mvdir foo.c foo.h ~/some/new/folder/