Pau*_*cks 241 unix linux macos mv mkdir
所以,如果我在我的主目录中并且我想将foo.c移动到〜/ bar/baz/foo.c,但那些目录不存在,是否有某种方法可以自动创建这些目录,以便你只需输入
mv foo.c ~/bar/baz/
Run Code Online (Sandbox Code Playgroud)
一切都会成功吗?看起来你可以将mv改为一个简单的bash脚本,它会检查这些目录是否存在,如果不存在则会调用mkdir然后调用mv,但我想我会检查是否有人有更好的想法.
Kar*_*enF 267
这个单行(在bash中)怎么样:
mkdir --parents ./some/path/; mv yourfile.txt $_
Run Code Online (Sandbox Code Playgroud)
打破这种情况:
mkdir --parents ./some/path
Run Code Online (Sandbox Code Playgroud)
创建目录(包括所有中间目录),之后:
mv yourfile.txt $_
Run Code Online (Sandbox Code Playgroud)
将文件移动到该目录($ _展开到传递给前一个shell命令的最后一个参数,即:新创建的目录).
我不确定这在其他炮弹中会有多大作用,但它可能会给你一些关于要寻找什么的想法.
以下是使用此技术的示例:
$ > ls
$ > touch yourfile.txt
$ > ls
yourfile.txt
$ > mkdir --parents ./some/path/; mv yourfile.txt $_
$ > ls -F
some/
$ > ls some/path/
yourfile.txt
Run Code Online (Sandbox Code Playgroud)
小智 58
mkdir -p `dirname /destination/moved_file_name.txt`
mv /full/path/the/file.txt /destination/moved_file_name.txt
Run Code Online (Sandbox Code Playgroud)
Sep*_*ero 20
保存为名为mv或mv.sh的脚本
#!/bin/bash
# mv.sh
dir="$2"
tmp="$2"; tmp="${tmp: -1}"
[ "$tmp" != "/" ] && dir="$(dirname "$2")"
[ -a "$dir" ] ||
mkdir -p "$dir" &&
mv "$@"
Run Code Online (Sandbox Code Playgroud)
或者放在〜/ .bashrc文件的末尾,作为替换每个新终端上的默认mv的函数.使用函数允许bash保持内存,而不是每次都必须读取脚本文件.
function mv ()
{
dir="$2"
tmp="$2"; tmp="${tmp: -1}"
[ "$tmp" != "/" ] && dir="$(dirname "$2")"
[ -a "$dir" ] ||
mkdir -p "$dir" &&
mv "$@"
}
Run Code Online (Sandbox Code Playgroud)
这些基于Chris Lutz的提交.
str*_*ger 13
你可以使用mkdir:
mkdir -p ~/bar/baz/ && \
mv foo.c ~/bar/baz/
Run Code Online (Sandbox Code Playgroud)
一个简单的脚本自动执行(未经测试):
#!/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 "$@"
Run Code Online (Sandbox Code Playgroud)
利用“获取传递给 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 "$@"; }
Run Code Online (Sandbox Code Playgroud)
使用这样的命令:
mvdir foo.c foo.h ~/some/new/folder/
Run Code Online (Sandbox Code Playgroud)
可能是以下shell脚本?
#!/bin/sh
if [[ -e $1 ]]
then
if [[ ! -d $2 ]]
then
mkdir --parents $2
fi
fi
mv $1 $2
Run Code Online (Sandbox Code Playgroud)
这是基本的部分.您可能希望添加一些内容来检查参数,如果目标存在,或者源目录存在,或者不存在(或者不覆盖不存在的内容),您可能希望更改行为.
听起来答案是否定的:)。我并不是真的想创建一个别名或func只是为了做到这一点,通常是因为它是一次性的,而且我已经在键入mv命令了,但是我发现有一个很好的解决方案:
mv *.sh shell_files/also_with_subdir/ || mkdir -p $_
Run Code Online (Sandbox Code Playgroud)
如果mv失败(dir不存在),它将创建目录(这是上一个命令的最后一个参数,也是如此$_)。因此,只需运行此命令,然后up重新运行它,这一次mv应该会成功。
小智 5
最简单的方法是:
mkdir [directory name] && mv [filename] $_
Run Code Online (Sandbox Code Playgroud)
假设我下载了位于我的下载目录 ( ~/download) 中的pdf 文件,并且我想将它们全部移动到一个不存在的目录中(假设my_PDF)。
我将输入以下命令(确保我当前的工作目录是~/download):
mkdir my_PDF && mv *.pdf $_
Run Code Online (Sandbox Code Playgroud)
如果你想像这样创建子目录,你可以添加-p选项mkdir:(假设我想创建一个名为 的子目录python):
mkdir -p my_PDF/python && mv *.pdf $_
Run Code Online (Sandbox Code Playgroud)
rsync命令只有在目标路径中的最后一个目录不存在时才能起作用,例如,~/bar/baz/如果目标路径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)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,如果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]
Run Code Online (Sandbox Code Playgroud)
所以基本上它应该是安全rsync -av --remove-source-files的用作mv.
| 归档时间: |
|
| 查看次数: |
172393 次 |
| 最近记录: |