move命令移动⽂件夹下所有⽂件_在不使⽤mv命令的情况下炒板栗的做法
移动⽂件
有时当你需要移动⼀个⽂件时,mv 命令似乎不是最佳选项,那么你会如何做呢?
-- Seth Kenlon(作者)
不起眼的 mv 命令是在你见过的每个 POSIX 系统中都能到的有⽤⼯具之⼀。它的作⽤是明确定义的,并且做得很好:将⽂件从⽂件系统中的⼀个位置移动到另⼀个位置。但是 Linux ⾮常灵活,还有其他移动⽂件的办法。使⽤不同的⼯具可以完美匹配⼀些特殊⽤例,这算⼀个⼩优势。
在远离 mv 之前,先看看这个命令的默认结果。⾸先,创建⼀个⽬录并⽣成⼀些权限为 777 的⽂件:
$ mkdir example$ touch example/{foo,bar,baz}$ for i in example/*; do ls /bin > "${i}"; done$ chmod 777 example/*
你可能不会这么认为,但是⽂件在⼀个 ⽂件系统 中作为条⽬存在,称为索引节点(通常称为 inode),你可以使⽤ ls 命令 及其 --inode 选项查看⼀个⽂件占⽤的 inode:
$ ls --inode example/foo7476868 example/foo
作为测试,将⽂件从⽰例⽬录移动到当前⽬录,然后查看⽂件的属性:佳能7d使用技巧
$ mv example/foo .$ ls -l -G -g --inode7476868 -rwxrwxrwx. 1 29545 Aug 2 07:28 foo
如你所见,原始⽂件及权限已经被“移动”,但它的 inode 没有变化。
这就是 mv ⼯具⽤来移动的⽅式:保持 inode 不变(除⾮⽂件被移动到不同的⽂件系统),并保留其所有权和权限。
其他⼯具提供了不同的选项。
复制和删除
在某些系统上,移动操作是真的在做移动:⽐特从⽂件系统中的某个位置删除并重新分配给另⼀个位置。这种⾏为在很⼤程度上已经失宠。现在,移动操作要么是属性重新分配(inode 现在指向⽂件组织中的不同位置),要么是复制和删除操作的组合。这种设计的哲学意图是确保在移动失败时,⽂件不会碎⽚化。
与 mv 不同,cp 命令会在⽂件系统中创建⼀个全新的数据对象,它有⼀个新的 inode 位置,并取决于 umask。你可以使⽤ cp 和 rm(如果有的话,或者 trash —— LCTT 译注:它是⼀个命令⾏回收站⼯具)命令来模仿 mv 命令。
$ cp example/foo .$ ls -l -G -g --inode7476869 -rwxrwxr-x. 29545 Aug 2 11:58 foo$ trash example/foo
⽰例中的新 foo ⽂件获得了 755 权限,因为此处的 umask 明确排除了写⼊权限。
$ umask0002
有关 umask 的更多信息,阅读 Alex Juarez 这篇关于 ⽂件权限 的⽂章。
查看和删除
与复制和删除类似,使⽤ cat (或 tac)命令在创建“移动”⽂件时分配不同的权限。假设当前⽬录中是⼀个没有 foo 的新测试环境:
$ cat example/foo > foo$ ls -l -G -g --inode7476869 -rw-rw-r--. 29545 Aug 8 12:21 foo$ trash example/foo
这次,创建了⼀个没有事先设置权限的新⽂件,所以⽂件最终权限完全取决于 umask 设置,它不会阻⽌⽤户和组的权限位(⽆论 umask 是什么,都不会为新⽂件授予可执⾏权限),但它会阻⽌其他⼈的写⼊(值为 2)。所以结果是⼀个权限是 664 的⽂件。
Rsync
rsync 命令是⼀个强⼤的多功能⼯具,⽤于在主机和⽂件系统位置之间发送⽂件。此命令有许多可⽤选项,包括使其⽬标镜像成为源。
你可以使⽤带有 --remove-source-files 选项的 rsync 复制,然后删除⽂件,并可以带上你选择执⾏同步的任何其他选项(常见的通⽤选项是 --archive):
吴静一
$ rsync --archive --remove-source-files example/foo .$ ls examplebar baz$ ls -lGgi7476870 -rwxrwxrwx. 1 seth users 29545 Aug 8 12:23 foo
在这⾥,你可以看到保留了⽂件权限和所有权,只是更新了时间戳,并删除了源⽂件。
警告:不要将此选项与 --delete 混淆,后者会从⽬标⽬录中删除(源⽬录中不存在的)⽂件。误⽤ --delete 会清除很多数据,建议你不要使⽤此选项,除⾮是在测试环境中。
你可以覆盖其中⼀些默认值,更改权限和修改设置:
$ rsync --chmod=666 --times  --remove-source-files example/foo .$ ls examplebar baz$ ls -lGgi7476871 -rw-rw-r--. 1 seth users 29545 Aug 8 12:55 foo 这⾥,⽬标的 umask 会⽣效,因此 --chmod=666 选项会产⽣⼀个权限为 644 的⽂件。
好处不仅仅是权限,与简单的 mv 命令相⽐,rsync 命令有 很多 有⽤的 选项 (其中最重要的是 --exclude 选项,这样你可以在⼀个⼤型移动操作中排除某些项⽬),这使它成为⼀个更强⼤的⼯具。例如,要在移动⽂件集合时排除所有备份⽂件:
$ rsync --chmod=666 --times  --exclude '*~'  --remove-source-files example/foo .
使⽤ install 设置权限
install 命令是⼀个专门⾯向开发⼈员的复制命令,主要是作为软件编译安装例程的⼀部分调⽤。它并不为⽤户所知(我经常想知道为什么它有这么⼀个直观的名字,⽽剩下的包管理器却只能使⽤缩写和昵称),但是 install 实际上是⼀种将⽂件放在你想要地⽅的有⽤⽅法。
install 命令有很多选项,包括 --backup 和 --compare 命令(以避免更新⽂件的新副本)。
与 cp 和 cat 命令不同,但与 mv 完全相同,install 命令可以在复制⽂件的同时⽽保留其时间戳:
$ install --preserve-timestamp example/foo .$ ls -l -G -g --inode7476869 -rwxr-xr-x. 1 29545 Aug 2 07:28 foo$ trash example/foo
在这⾥,⽂件被复制到⼀个新的 inode,但它的 mtime(修改时间)没有改变。但权限被设置为 install 的默认值 755。
你可以使⽤ install 来设置⽂件的权限,所有者和组:夏至吃什么风俗食物
$ install --preserve-timestamp  --owner=skenlon  --group=dialout  --mode=666 example/foo .$ ls -li7476869 -rw-rw-rw-. 1 skenlon dialout 29545 Aug 2 07:28 foo$移动、复制和删除第一场雪的朋友圈说说
⽂件包含数据,⽽真正重要的⽂件包含你的数据。学会聪明地管理它们是很重要的,现在你有了确保以你想要的⽅式来处理数据的⼯具包。
大脸适合的发型你是否有不同的数据管理⽅式?在评论中告诉我们你的想法。