linux 中移动文件
在Linux中移动文件看似比较简单,但是可用的选项却比大多数人想象的要多。 本文向初学者讲授如何在GUI和命令行中移动文件,同时还解释了幕后实际发生的情况,并介绍了许多经验丰富的用户很少探索的命令行选项。
在研究移动文件之前,值得仔细研究一下_移动_文件系统对象时实际发生的情况。 创建文件后,会将其分配给一个_inode_ ,它是用于数据存储的文件系统中的固定点。 您可以使用ls命令将inode映射到文件:
$ ls --inode example.txt
7344977 example.txt
移动文件时,实际上并没有将数据从一个索引节点移动到另一个索引节点,而只是给文件对象分配了新的名称或文件路径。 实际上,文件在移动时会保留其权限,因为移动文件不会更改或重新创建它。
文件和目录索引节点从不暗示继承,而是由文件系统本身决定的。 Inode分配是基于文件创建时间的顺序分配的,并且完全独立于组织计算机的方式。 目录“内部”的文件的索引节点号可能比其父目录的索引号低,或较高。 例如:
$ mkdir foo
$ mv example.txt foo
$ ls --inode
7476865 foo
$ ls --inode foo
7344977 example.txt
但是,将文件从一个硬盘驱动器移动到另一个硬盘驱动器时,索引节点很有可能会发生变化。 发生这种情况是因为必须将新数据写入新文件系统。 因此,在Linux中,移动和重命名文件的操作实际上是相同的操作。 无论您将文件移动到另一个目录还是使用新名称移动到同一目录,这两个操作均由同一基础程序执行。
本文重点介绍将文件从一个目录移动到另一个目录。
GUI是大多数人熟悉的友好且熟悉的抽象层,位于二进制数据的复杂集合之上。 这也是在Linux上移动文件的第一种也是最直观的方法。 如果您习惯了一般的桌面体验,那么您可能已经知道如何在硬盘驱动器上移动文件。 例如,在GNOME桌面上,将文件从一个窗口拖放到另一个窗口时的默认操作是移动文件而不是复制文件,因此这可能是桌面上最直观的操作之一:
默认情况下,KDE Plasma桌面中的Dolphin文件管理器提示用户进行操作。 拖动文件时按住Shift键可强制执行移动操作:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8FE1FDha-1648354911959)(https://opensource.com/sites/default/files/uploads/kde-mv.jpg “在KDE中移动文件。”)]
MV 一个具有可预测语法的简单命令**mv **将源文件移动到指定的目标,每个目标都由绝对或相对文件路径定义。 如前所述, mv是POSIX用户的常用命令,其许多附加修饰符通常是未知的,因此,无论您是新手还是有经验的人,本文都会为您带来一些有用的修饰符。
但是,并非所有的mv命令都是由同一个人编写的,因此取决于您的操作系统,您可能拥有GNU mv ,BSD mv或Sun mv 。 命令选项因实现而异(BSD mv根本没有长选项),因此请参考您的mv手册页以查看受支持的内容,或者安装您的首选版本(这是开源的奢侈之处)。
要使用mv将文件从一个文件夹移动到另一个文件夹,请记住语法mv 。 例如,要将文件example.txt移到“ **文档”**目录中:
$ touch example.txt
$ mv example.txt ~/Documents
$ ls ~/Documents
example.txt
就像当您通过将文件拖放到文件夹图标上来移动文件时,此命令不会将example.txt替换为Documents 。 而是, mv检测到Documents是一个文件夹,然后将example.txt文件放入其中。
您还可以方便地在移动文件时重命名该文件:
$ touch example.txt
$ mv example.txt ~/Documents/foo.txt
$ ls ~/Documents
foo.txt
这很重要,因为即使您不想将文件移动到另一个位置,它也可以使您重命名文件,例如:
$ touch example.txt
$ mv example.txt foo2.txt
$ ls
foo2.txt
mv命令不会像cp一样将文件与目录区分开。 您可以使用相同的语法移动目录或文件:
$ touch file.txt
$ mkdir foo_directory
$ mv file.txt foo_directory
$ mv foo_directory ~/Documents
如果将文件复制到已经存在相同名称文件的目录中,则mv命令默认将目标文件替换为您要移动的文件。 这种行为称为“ 破坏” ,有时正是您想要的。 其他时间不是。
某些发行版_别名_ mv到mv --interactive (或者您可以编写自己的 别名 ),提示您进行确认。 有些没有。 无论哪种方式,都可以使用**–interactive或-i选项来确保在两个相同名称的文件发生冲突的情况下mv**要求确认:
$ mv --interactive example.txt ~/Documents
mv: overwrite '~/Documents/example.txt'?
如果不想手动干预,请使用**–no-clobber或-n代替。 如果发生冲突,此标志将静默拒绝移动动作。 在此示例中, / Documents中已经存在一个名为example.txt的** 文件 ,因此不会按照指示将其从当前目录移走:
$
mv
--no-clobber example.txt ~
/ Documents
$
ls
example.txt
如果您使用的是GNU mv ,那么备份选项提供了另一种安全的移动方式。 要创建任何有冲突的目标文件的备份,请使用**-b**选项:
$ mv -b example.txt ~/Documents
$ ls ~/Documents
example.txt ? ?example.txt~
该标志确保mv完成移动动作,但也保护目标位置中的所有先前存在的文件。
另一个GNU备份选项是**–backup** ,它使用一个参数定义备份文件的命名方式:
例如:
$ mv --backup=numbered example.txt ~/Documents
$ ls ~/Documents
-rw-rw-r--. 1 seth users 128 Aug ?1 17:23 example.txt
-rw-rw-r--. 1 seth users 128 Aug ?1 17:20 example.txt.~1~
可以使用环境变量VERSION_CONTROL设置默认的备份方案。 您可以在**/ .bashrc**文件中设置环境变量,也可以在命令前动态设置环境变量:
$ VERSION_CONTROL=numbered mv --backup example.txt ~/Documents
$ ls ~/Documents
-rw-rw-r--. 1 seth users 128 Aug ?1 17:23 example.txt
-rw-rw-r--. 1 seth users 128 Aug ?1 17:20 example.txt.~1~
-rw-rw-r--. 1 seth users 128 Aug ?1 17:22 example.txt.~2~
–backup选项仍然遵循**–interactive或-i**选项,因此即使它在执行备份之前创建了备份,它仍会提示您覆盖目标文件:
$ mv --backup=numbered example.txt ~/Documents
mv: overwrite '~/Documents/example.txt'? y
$ ls ~/Documents
-rw-rw-r--. 1 seth users 128 Aug ?1 17:24 example.txt
-rw-rw-r--. 1 seth users 128 Aug ?1 17:20 example.txt.~1~
-rw-rw-r--. 1 seth users 128 Aug ?1 17:22 example.txt.~2~
-rw-rw-r--. 1 seth users 128 Aug ?1 17:23 example.txt.~3~
您可以使用**–force或-f选项覆盖-i** 。
$ mv --backup=numbered --force example.txt ~/Documents
$ ls ~/Documents
-rw-rw-r--. 1 seth users 128 Aug ?1 17:26 example.txt
-rw-rw-r--. 1 seth users 128 Aug ?1 17:20 example.txt.~1~
-rw-rw-r--. 1 seth users 128 Aug ?1 17:22 example.txt.~2~
-rw-rw-r--. 1 seth users 128 Aug ?1 17:24 example.txt.~3~
-rw-rw-r--. 1 seth users 128 Aug ?1 17:25 example.txt.~4~
–backup选项在BSD mv中不可用。
移动多个文件时, mv将最终目录命名为目标:
$ mv foo bar baz ~/Documents
$ ls ~/Documents
foo ? bar ? baz
如果最后一项不是目录,则mv返回错误:
$ mv foo bar baz
mv: target 'baz' is not a directory
GNU mv的语法相当灵活。 如果无法为mv命令提供目的地作为最后一个参数,请使用**–target-directory或-t**选项:
$ mv --target-directory=~/Documents foo bar baz
$ ls ~/Documents
foo ? bar ? baz
当从其他命令(例如find命令, xargs或GNU Parallel)的输出构造mv命令时,这特别有用。
使用GNU mv ,您可以根据要移动的文件是否比要替换的目标文件新来定义移动动作。 该选项与**–update或-u**选项一起可用,在BSD mv中不可用:
$ ls -l ~/Documents
-rw-rw-r--. 1 seth users 128 Aug ?1 17:32 example.txt
$ ls -l
-rw-rw-r--. 1 seth users 128 Aug ?1 17:42 example.txt
$ mv --update example.txt ~/Documents
$ ls -l ~/Documents
-rw-rw-r--. 1 seth users 128 Aug ?1 17:42 example.txt
$ ls -l
此结果仅基于文件的修改时间,而不是基于两个文件的差异,因此请谨慎使用。 仅通过触摸命令就可以欺骗mv :
$
cat example.txt
one
$
cat ~
/ Documents
/ example.txt
one
two
$
touch example.txt
$
mv
--update example.txt ~
/ Documents
$
cat ~
/ Documents
/ example.txt
one
显然,这不是可用的最智能的更新功能,但是它提供了防止覆盖最新数据的基本保护。
除了mv命令外,还有更多移动数据的方法,但是作为作业的默认程序, mv是一个很好的通用选项。 既然您知道可以使用的选项,则可以比以前更聪明地使用mv 。
翻译自: https://opensource.com/article/19/8/moving-files-linux-depth
linux 中移动文件
件
文章浏览阅读1.6k次。宋体 “\5B8B\4F53”楷体 “\6977\4f53”颜体 “\989c\4f53”sans-serif更多免费商用字体 https://www.uisdc.com/200-models-free-commercial-fonts_verdana是免费字体吗
文章浏览阅读554次。我们知道JVM加载类的过程遵循“双亲委派机制”,每当JVM启动时,是通过一个ClassLoader来加载class文件的。ClassLoader有三个实现,分别是:BootstrapLoader,ExtClassLoader和AppClassLoader.三个类加载器的作用不同,所加载的class文件也不相同。下面我们通过代码实现查看三个类加载器分别所加载的class路径/** * * @author JJ_knows * */public class ClassLoaderTe_代码查看扩展类加载器加载路径
文章浏览阅读219次。发现一个介绍Android启动的系列文章,正文如下:=================================================================================================================1 Bootloader对于一般的ARM处理器,CPU上电或复位执行第一条指令所在地址,即第一段程_android linux 加载 启动地址
文章浏览阅读823次。跟着玉涛学长学做游戏一,首先要明确你要做什么游戏,所做的游戏要分哪几个类。我要做的是小汽车类的游戏,所以我要分以下几个类:小汽车一个类主体界面一个类按键监听也可以另作一个类二,创建一个文件夹 CarGame1.文件夹下创建一个包(package).2.先创建主体界面类(GameInterface)1.需要用到画笔和线程,还有类与对象的知识。首先 GameInter..._游戏小车程序
文章浏览阅读1.1k次。RAC 安装的时候报错,INS-40718这个是自己填写的 scan name 和 /etc/hosts 里定义的不一致 可以cat/etc/hosts 看一下INS - 30516这个原因是 由于用使用原来安装的盘,没有清理过,所以报错清理一下就好dd if=/dev/zero of=/dev/raw/raw1 bs=1M..._ins30516
文章浏览阅读429次。编程语言关于thinkphp邮箱验证码前后台下面由thinkphp教程栏目给大家介绍关于thinkphp邮箱验证码前后台,希望对需要的朋友有所帮助!thinkphp邮箱验证码前后台思路:前台用jquery.validate验证,验证邮箱是否存在等等,交互用ajax来做。后端用邮箱类库直接上代码吧准备:1.下载PHPMailer类库,放到Application/Thinkphp/Library/Vendor/中,在网上搜搜,搜不到可以联系我2.开启SMTP,举个网易邮箱的例子_thinkphp6qq邮箱验证码
文章浏览阅读2.8k次。项目在高版本linux版本编译,可执行文件放在低版本的服务器上跑出现问题,报错 undefined reference to `__isoc99_sscanf'原因是我们的程序中使用的某个库,如xxx.a, xxx.so是在高版本的glibc环境里面进行编译的。有2种解决方法:1. 升级我们的glibc到2.7版本2. 找到xxx.a 或 xxx.so,在我们的_linux glewinfo.c.o: undefined reference to symbol '__isoc99_sscanf@@glibc_2.
文章浏览阅读8.5k次。ZooKeeper的概念和基础简介ZooKeeper的使命通过ZooKeeper构建分布式系统合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图导出与导入导出导入简介ZooKeeper是Google的Chubby项目的开源实现,它曾作为Hadoop的子项目,_数据协同 zeakeep
文章浏览阅读686次。在Linux信号机制中,存在多种进程中断信号。其中比较典型的有 SIGNKILL(9) 和 SIGNTERM(15)。SIGNKILL(9) 和 SIGNTERM(15) 的区别在于:SIGNKILL(9) 的效果是立即杀死进程. 该信号不能被阻塞, 处理和忽略。SIGNTERM(15) 的效果是正常退出进程,退出前可以被阻塞或回调处理。并且它是Linux缺省的程序中断信号。由此可_signkill
文章浏览阅读1.2k次。在Android上面测试的小demo,通过xutils这个框架,轻松发起post或get,同时又同步,异步等方式package com.example.xutilsdemo;import java.io.BufferedReader;import java.io.InputStream;import java.io.InputStreamReader;import java.util.Arra_xutils设置form表单
文章浏览阅读331次。/** * Description: * Some functions to fix the PNG files transparent problem in IE6 * * History: * Created by Moky @ 2008-09-19 *//* Usage: // just i_img id="img_transparent
文章浏览阅读7.1k次。1、本文内容我们在Web项目开发过程中,一般来说访问一个处理器,然后会返回一个视图,或者跳转到另外的处理器。但是随着项目越来越复杂,需求越来越复杂,对于处理器返回数据的类型要求也越来越多。比如要求能够返回JSON类型的数据、或者能够返回XML格式的数据,或者返回二进制的数据流等等。SpringMVC提供了这样的一个机制,允许控制器返回的数据不经过正常的视图处理流程,而是直接将返回的数据写入响应..._c# controller接收处理json、xml格式数据