所以,如果我在我的主目录下,我想把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,但我想检查一下,看看是否有人有更好的主意。
当前回答
在将文件批量移动到新的子目录时,我经常遇到这个问题。理想情况下,我想这样做:
mv * newdir/
这个线程中的大多数答案都建议mkdir然后mv,但这导致:
mkdir newdir && mv * newdir
mv: cannot move 'newdir/' to a subdirectory of itself
我面临的问题略有不同,因为我想全面移动所有内容,并且,如果我在移动之前创建了新目录,那么它也会尝试将新目录移动到自己。所以,我通过使用父目录来解决这个问题:
mkdir ../newdir && mv * ../newdir && mv ../newdir .
警告:不能在根文件夹(/)中工作。
其他回答
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)
在这种情况下,如果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 -p `dirname /destination/moved_file_name.txt`
mv /full/path/the/file.txt /destination/moved_file_name.txt
这将把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输出。
对于这个问题,有很多相互矛盾的解决方案,以下是对我们有效的解决方案:
## 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。
我在linux上用install命令完成了这一点:
root@logstash:# myfile=bash_history.log.2021-02-04.gz ; install -v -p -D $myfile /tmp/a/b/$myfile
bash_history.log.2021-02-04.gz -> /tmp/a/b/bash_history.log.2021-02-04.gz
唯一的缺点是文件权限被改变了:
root@logstash:# ls -lh /tmp/a/b/
-rwxr-xr-x 1 root root 914 Fev 4 09:11 bash_history.log.2021-02-04.gz
如果你不介意重置权限,你可以使用:
-g, --group=GROUP set group ownership, instead of process' current group
-m, --mode=MODE set permission mode (as in chmod), instead of rwxr-xr-x
-o, --owner=OWNER set ownership (super-user only)