所以,如果我在我的主目录下,我想把foo.c移动到~/bar/baz/foo.c,但是这些目录不存在,有没有什么方法可以自动创建这些目录,这样你只需要输入

mv foo.c ~/bar/baz/ 

一切都会解决的吗?似乎可以将mv别名为一个简单的bash脚本,该脚本将检查这些目录是否存在,如果不存在,将调用mkdir,然后调用mv,但我想检查一下,看看是否有人有更好的主意。


当前回答

这将把foo.c移动到新目录baz和父目录栏。

mv foo.c `mkdir -p ~/bar/baz/ && echo $_`

mkdir的-p选项将根据需要创建中间目录。 如果没有-p,路径前缀中的所有目录必须已经存在。

反引号' '内的所有内容都将被执行,输出将作为命令的一部分内联返回。 由于mkdir不返回任何东西,因此只有echo $_的输出将被添加到命令中。

$_引用前面执行的命令的最后一个参数。 在本例中,它将返回传递给mkdir命令的新目录(~/bar/baz/)的路径。 我解压缩了一个归档文件,但没有给出目的地,并希望将除demo-app.zip之外的所有文件从当前目录移动到一个名为demo-app的新目录。下面这句话就有效果:

mv `ls -A | grep -v demo-app.zip` `mkdir -p demo-app && echo $_`

ls -A返回包括隐藏文件在内的所有文件名(隐式文件除外)。和. .)。

管道符号|用于将ls命令的输出输送到grep(一个命令行、纯文本搜索实用程序)。 -v标志指示grep查找并返回除demo-app.zip之外的所有文件名。 该文件列表作为move命令mv的源参数添加到命令行。target参数是传递给mkdir的新目录的路径,使用$_引用并使用echo输出。

其他回答

保存为名为mv.sh的脚本

#!/bin/bash
# mv.sh
dir="$2" # Include a / at the end to indicate directory (not filename)
tmp="$2"; tmp="${tmp: -1}"
[ "$tmp" != "/" ] && dir="$(dirname "$2")"
[ -a "$dir" ] ||
mkdir -p "$dir" &&
mv "$@"

或者在~/后面加上。Bashrc文件作为一个函数,在每个新终端上替换默认mv。使用函数可以让bash保持内存,而不必每次都读取脚本文件。

function mvp ()
{
    dir="$2" # Include a / at the end to indicate directory (not filename)
    tmp="$2"; tmp="${tmp: -1}"
    [ "$tmp" != "/" ] && dir="$(dirname "$2")"
    [ -a "$dir" ] ||
    mkdir -p "$dir" &&
    mv "$@"
}

使用示例:

mv.sh file ~/Download/some/new/path/ # <-End with slash

这些都是根据克里斯·卢茨提交的。

在将文件批量移动到新的子目录时,我经常遇到这个问题。理想情况下,我想这样做:

mv * newdir/  

这个线程中的大多数答案都建议mkdir然后mv,但这导致:

mkdir newdir && mv * newdir 
mv: cannot move 'newdir/' to a subdirectory of itself

我面临的问题略有不同,因为我想全面移动所有内容,并且,如果我在移动之前创建了新目录,那么它也会尝试将新目录移动到自己。所以,我通过使用父目录来解决这个问题:

mkdir ../newdir && mv * ../newdir && mv ../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

最简单的方法是:

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 $_

你甚至可以使用大括号扩展:

mkdir -p directory{1..3}/subdirectory{1..3}/subsubdirectory{1..2}      

创建3个目录(directory1, directory2, directory3), 每个目录中都有两个子目录(subdirectory1, subdirectory2), 每个目录中都有两个子目录(subsubdirectory1和subsubdirectory2)。

您必须使用bash 3.0或更新版本。