Answers:
这个单线(bash)怎么样:
mkdir --parents ./some/path/; mv yourfile.txt $_
分解:
mkdir --parents ./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
./
到处都有多余的痴迷?args不是没有.
目录的PATH命令...
--parents
在macOS 10.13.2上不可用。您需要使用-p
。
mkdir -p ./some/path/foo; mv yourfile.txt $_:h
mkdir -p `dirname /destination/moved_file_name.txt`
mv /full/path/the/file.txt /destination/moved_file_name.txt
dirname
不需要其参数存在,它是纯字符串操作。不能代表其他发行版。此代码无错。
for f in *.txt; do mkdir -p `dirname /destination/${f//regex/repl}`; mv "$f" "/destination/${f//regex/repl}; done
另存为名为mv或mv.sh的脚本
#!/bin/bash
# mv.sh
dir="$2"
tmp="$2"; tmp="${tmp: -1}"
[ "$tmp" != "/" ] && dir="$(dirname "$2")"
[ -a "$dir" ] ||
mkdir -p "$dir" &&
mv "$@"
或者将〜/ .bashrc文件的末尾作为函数替换每个新终端上的默认mv。使用函数可以使bash保留其内存,而不必每次都读取脚本文件。
function mv ()
{
dir="$2"
tmp="$2"; tmp="${tmp: -1}"
[ "$tmp" != "/" ] && dir="$(dirname "$2")"
[ -a "$dir" ] ||
mkdir -p "$dir" &&
mv "$@"
}
这些基于Chris Lutz的提交。
mv
命令。对于脚本编写尤其有用,即,您不一定要运行检查并在mkdir -p
需要使用时随时运行mv
。但是由于我希望使用默认的错误行为mv
,因此我将函数名称更改为mvp
-以便知道何时可以创建目录。
[ ! -a "$dir" ]
我进行的实验的含义,其中右半部分为真和假,都被评估为真。出于其他原因,tmp =“ $ {tmp:-1}”似乎抓住了文件的最后一个字符以确保它不是路径(/)
您可以使用mkdir
:
mkdir -p ~/bar/baz/ && \
mv foo.c ~/bar/baz/
自动执行此操作的简单脚本(未经测试):
#!/bin/sh
# Grab the last argument (argument number $#)
eval LAST_ARG=\$$#
# Strip the filename (if it exists) from the destination, getting the directory
DIR_NAME=`echo $2 | sed -e 's_/[^/]*$__'`
# Move to the directory, making the directory if necessary
mkdir -p "$DIR_NAME" || exit
mv "$@"
以下shell脚本,也许?
#!/bin/sh
if [[ -e $1 ]]
then
if [[ ! -d $2 ]]
then
mkdir --parents $2
fi
fi
mv $1 $2
那是基本部分。您可能需要添加一些内容来检查参数,并且如果目标存在,源目录存在或不存在(即,不要覆盖不存在的内容),则可能需要更改行为。 。
仅当目标路径中的最后一个目录不存在时,rsync命令才能发挥作用,例如,对于~/bar/baz/
if 的目标路径bar
存在但baz
不存在,则可以使用以下命令:
rsync -av --remove-source-files foo.c ~/bar/baz/
-a, --archive archive mode; equals -rlptgoD (no -H,-A,-X)
-v, --verbose increase verbosity
--remove-source-files sender removes synchronized files (non-dir)
在这种情况下,baz
将创建目录(如果不存在)。但是,如果双方bar
并baz
没有存在的rsync将失败:
sending incremental file list
rsync: mkdir "/root/bar/baz" failed: No such file or directory (2)
rsync error: error in file IO (code 11) at main.c(657) [Receiver=3.1.2]
因此,基本上,rsync -av --remove-source-files
用作的别名应该是安全的mv
。
最简单的方法是:
mkdir [directory name] && mv [filename] $_
假设我下载了位于下载目录(~/download
)中的pdf文件,并且想将所有文件都移到一个不存在的目录中(假设my_PDF
)。
我将输入以下命令(确保当前工作目录为~/download
):
mkdir my_PDF && mv *.pdf $_
如果要创建子目录,可以像这样添加-p
选项mkdir
:(假设我要创建一个名为的子目录python
):
mkdir -p my_PDF/python && mv *.pdf $_
更安静,但工作方式:
mkdir -p $2
rmdir $2
mv $1 $2
使用mkdir -p创建包含共享目标文件名的临时目录的目录,然后使用简单的rmdir删除该文件名目录,然后将文件移至新目标。我认为使用dirname的答案可能是最好的。
这将移至带有父目录foo.c
的新baz
目录bar
。
mv foo.c `mkdir -p ~/bar/baz/ && echo $_`
将根据需要创建中间目录的-p
选项mkdir
。
在没有-p
所有目录的情况下,路径前缀必须已经存在。
反引号内的所有内容都``
将执行,并且输出将作为命令的一部分内联返回。
由于mkdir
不返回任何内容,因此只会将输出结果echo $_
添加到命令中。
$_
将最后一个参数引用到先前执行的命令。
在这种情况下,它将返回~/bar/baz/
传递给mkdir
命令的新目录()的路径。
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
。目标参数是新目录的路径,该目录传递到mkdir
使用引用$_
并使用输出echo
。
您甚至可以使用大括号扩展名:
mkdir -p directory{1..3}/subdirectory{1..3}/subsubdirectory{1..2}
您必须使用bash 3.0或更高版本。
$what=/path/to/file;
$dest=/dest/path;
mkdir -p "$(dirname "$dest")";
mv "$what" "$dest"
您可以链接命令:mkdir ~/bar/baz | mv foo.c ~/bar/baz/
或shell脚本在这里:
#!/bin/bash
mkdir $2 | mv $1 $2
1.打开任何文本编辑器
。2.复制粘贴 shell脚本。
3.将其另存为mkdir_mv.sh。4.
输入脚本的目录:cd your/script/directory
5.更改文件模式:chmod +x mkdir_mv.sh
6.设置别名:alias mv="./mkdir_mv.sh"
现在,无论何时运行,mv
如果不存在命令创建目录,都会创建命令移动目录。