标签 移动 下的文章

无论你是刚接触 Linux 的文件移动的新手还是已有丰富的经验,你都可以通过此深入的文章中学到一些东西。

在 Linux 中移动文件看似比较简单,但是可用的选项却比大多数人想象的要多。本文介绍了初学者如何在 GUI 和命令行中移动文件,还介绍了底层实际上发生了什么,并介绍了许多有一定经验的用户也很少使用的命令行选项。

移动什么?

在研究移动文件之前,有必要仔细研究移动文件系统对象时实际发生的情况。当文件创建后,会将其分配给一个 索引节点 inode ,这是文件系统中用于数据存储的固定点。你可以使用 ls 命令看到文件对应的索引节点:

$ ls --inode example.txt
7344977 example.txt

移动文件时,实际上并没有将数据从一个索引节点移动到另一个索引节点,只是给文件对象分配了新的名称或文件路径而已。实际上,文件在移动时会保留其权限,因为移动文件不会更改或重新创建文件。(LCTT 译注:在不跨卷、分区和存储器时,移动文件是不会重新创建文件的;反之亦然)

文件和目录的索引节点并没有暗示这种继承关系,而是由文件系统本身决定的。索引节点的分配是基于文件创建时的顺序分配的,并且完全独立于你组织计算机文件的方式。一个目录“内”的文件的索引节点号可能比其父目录的索引节点号更低或更高。例如:

$ mkdir foo
$ mv example.txt foo
$ ls --inode
7476865 foo
$ ls --inode foo
7344977 example.txt

但是,将文件从一个硬盘驱动器移动到另一个硬盘驱动器时,索引节点基本上会更改。发生这种情况是因为必须将新数据写入新文件系统。因此,在 Linux 中,移动和重命名文件的操作实际上是相同的操作。无论你将文件移动到另一个目录还是在同一目录使用新名称,这两个操作均由同一个底层程序执行。

本文重点介绍将文件从一个目录移动到另一个目录。

用鼠标移动文件

图形用户界面是大多数人都熟悉的友好的抽象层,位于复杂的二进制数据集合之上。这也是在 Linux 桌面上移动文件的首选方法,也是最直观的方法。从一般意义上来说,如果你习惯使用台式机,那么你可能已经知道如何在硬盘驱动器上移动文件。例如,在 GNOME 桌面上,将文件从一个窗口拖放到另一个窗口时的默认操作是移动文件而不是复制文件,因此这可能是该桌面上最直观的操作之一:

 title=

而 KDE Plasma 桌面中的 Dolphin 文件管理器默认情况下会提示用户以执行不同的操作。拖动文件时按住 Shift 键可强制执行移动操作:

 title=

在命令行移动文件

用于在 Linux、BSD、Illumos、Solaris 和 MacOS 上移动文件的 shell 命令是 mv。不言自明,简单的命令 mv <source> <destination> 会将源文件移动到指定的目标,源和目标都由绝对相对文件路径定义。如前所述,mvPOSIX 用户的常用命令,其有很多不为人知的附加选项,因此,无论你是新手还是有经验的人,本文都会为你带来一些有用的选项。

但是,不是所有 mv 命令都是由同一个人编写的,因此取决于你的操作系统,你可能拥有 GNU mv、BSD mv 或 Sun mv。命令的选项因其实现而异(BSD mv 根本没有长选项),因此请参阅你的 mv 手册页以查看支持的内容,或安装你的首选版本(这是开源的奢侈之处)。

移动文件

要使用 mv 将文件从一个文件夹移动到另一个文件夹,请记住语法 mv <source> <destination>。 例如,要将文件 example.txt 移到你的 Documents 目录中:

$ touch example.txt
$ mv example.txt ~/Documents
$ ls ~/Documents
example.txt

就像你通过将文件拖放到文件夹图标上来移动文件一样,此命令不会将 Documents 替换为 example.txt。相反,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`

移动目录

不像 cp 命令,mv 命令处理文件和目录没有什么不同,你可以用同样的格式移动目录或文件:

$ touch file.txt
$ mkdir foo_directory
$ mv file.txt foo_directory
$ mv foo_directory ~/Documents

安全地移动文件

如果你移动一个文件到一个已有同名文件的地方,默认情况下,mv 会用你移动的文件替换目标文件。这种行为被称为 清除 clobbering ,有时候这就是你想要的结果,而有时则不是。

一些发行版将 mv 别名定义为 mv --interactive(你也可以自己写一个),这会提醒你确认是否覆盖。而另外一些发行版没有这样做,那么你可以使用 --interactive-i 选项来确保当两个文件有一样的名字而发生冲突时让 mv 请你来确认。

$ mv --interactive example.txt ~/Documents
mv: overwrite '~/Documents/example.txt'?

如果你不想手动干预,那么可以使用 --no-clobber-n。该选项会在发生冲突时静默拒绝移动操作。在这个例子当中,一个名为 example.txt 的文件以及存在于 ~/Documents,所以它不会如命令要求从当前目录移走。

$ 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,它带有一个定义了备份文件如何命名的参数。

  • existing:如果在目标位置已经存在了编号备份文件,那么会创建编号备份。否则,会使用 simple 方式。
  • none:即使设置了 --backup,也不会创建备份。当 mv 被别名定义为带有备份选项时,这个选项可以覆盖这种行为。
  • numbered:给目标文件名附加一个编号。
  • simple:给目标文件附加一个 ~,当你日常使用带有 --ignore-backups 选项的 ls 时,这些文件可以很方便地隐藏起来。

简单来说:

$ 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

当从某些其他命令的输出构造 mv 命令时(例如 find 命令、xargsGNU Parallel),这特别有用。

基于修改时间移动

使用 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

此结果仅基于文件的修改时间,而不是两个文件的差异,因此请谨慎使用。只需使用 touch 命令即可愚弄 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 了。


via: https://opensource.com/article/19/8/moving-files-linux-depth

作者:Seth Kenlon 选题:lujun9972 译者:wxy 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

前几天,我想知道如何将多个文件类型从一个目录移动(不复制)到另一个目录。我已经知道如何查找并将某些类型的文件从一个目录复制到另一个目录。但是,我不知道如何同时移动多种文件类型。如果你曾遇到这样的情况,我知道在类 Unix 系统中从命令行执行该操作的一个简单方法。

同时移动多种文件类型

想象一下这种场景,你在名为 dir1 的目录中有多种类型的文件,例如 .pdf、 .doc、 .mp3、 .mp4、 .txt 等等。我们来看看 dir1 的内容:

$ ls dir1
file.txt image.jpg mydoc.doc personal.pdf song.mp3 video.mp4

你希望将某些文件类型(不是所有文件类型)移动到另一个位置。例如,假设你想将 .doc、 .pdf 和 .txt 文件一次性移动到名为 dir2 的另一个目录中。

要同时将 .doc、 .pdf 和 .txt 文件从 dir1 移动到 dir2,命令是:

$ mv dir1/*.{doc,pdf,txt} dir2/

很容易,不是吗?

现在让我们来查看一下 dir2 的内容:

$ ls dir2/
file.txt mydoc.doc personal.pdf

看到了吗?只有 .doc、 .pdf 和 .txt 从 dir1 移到了 dir2

在上面的命令中,你可以在花括号内添加任意数量的文件类型,以将它们移动到不同的目录中。它在 Bash 上非常适合我。

另一种移动多种文件类型的方法是转到源目录,在我们的例子中即为 dir1

$ cd ~/dir1

将你选择的文件类型移动到目的地(即 dir2),如下所示:

$ mv *.doc *.txt *.pdf /home/sk/dir2/

要移动具有特定扩展名的所有文件,例如 .doc,运行:

$ mv dir1/*.doc dir2/

更多细节,参考 man 页:

$ man mv

移动一些相同或不同的文件类型很容易!你可以在 GUI 模式下单击几下鼠标,或在 CLI 模式下使用一行命令来完成。但是,如果目录中有数千种不同的文件类型,并且希望一次将多种文件类型移动到不同的目录,这将是一项繁琐的任务。对我来说,上面的方法很容易完成工作!如果你知道任何其它一行命令可以一次移动多种文件类型,请在下面的评论部分与我们分享。我会核对并更新指南。

这些就是全部了,希望这很有用。更多好东西将要来了,敬请关注!

共勉!


via: https://www.ostechnix.com/how-to-move-multiple-file-types-simultaneously-from-commandline/

作者:SK 选题:lujun9972 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

帮助用户在智能手机或平板上快速轻松地找到他们所需的信息。

我并不是完全相信移动为先的理念,但是我确实发现更多的人使用智能手机和平板电脑等移动设备来获取信息。这包括在线的软件和硬件文档,但它们大部分都是冗长的,不适合小屏幕。通常情况下,它的伸缩性不太好,而且很难导航。

当用户使用移动设备访问文档时,他们通常需要迅速获取信息以了解如何执行任务或解决问题,他们不想通过看似无尽的页面来寻找他们需要的特定信息。幸运的是,解决这个问题并不难。以下是一些技巧,可以帮助你构建文档以满足移动阅读器的需求。

简短一点

这意味着简短的句子,简短的段落和简短的流程。你不是在写一部长篇小说或一段长新闻。使你的文档简洁。尽可能使用少量的语言来获得想法和信息。

以广播新闻报道为示范:关注关键要素,用简单直接的语言对其进行解释。不要让你的读者在屏幕上看到冗长的文字。

另外,直接切入重点。关注读者需要的信息。在线发布的文档不应该像以前厚厚的手册一样。不要把所有东西都放在一个页面上,把你的信息分成更小的块。接下来是怎样做到这一点:

主题

在技术写作的世界里,主题是独立的,独立的信息块。每个主题都由你网站上的单个页面组成。读者应该能从特定的主题中获取他们需要的信息 -- 并且只是那些信息。要做到这一点,选择哪些主题要包含在文档中并决定如何组织它们:

DITA

达尔文信息类型化体系结构 Darwin Information Typing Architecture (DITA) 是用于编写和发布的一个 XML 模型。它广泛采用在技术写作中,特别是作为较长的文档集中。

我并不是建议你将文档转换为 XML(除非你真的想)。相反,考虑将 DITA 的不同类型主题的概念应用到你的文档中:

  • 一般:概述信息
  • 任务:分步骤的流程
  • 概念:背景或概念信息
  • 参考:API 参考或数据字典等专用信息
  • 术语表:定义术语
  • 故障排除:有关用户可能遇到的问题以及如何解决问题的信息

你会得到很多单独的页面。要连接这些页面:

链接

许多内容管理系统、维基和发布框架都包含某种形式的导航 —— 通常是目录或面包屑导航),这是一种在移动设备上逐渐消失的导航。

为了加强导航,在主题之间添加明确的链接。将这些链接放在每个主题末尾的“另请参阅”或“相关主题”的标题处。每个部分应包含两到五个链接,指向与当前主题相关的概述、概念和参考主题。

如果你需要指向文档集之外的信息,请确保链接在浏览器新的选项卡中打开。这将把读者送到另一个网站,同时也将读者继续留你的网站上。

这解决了文本问题,那么图片呢?

不使用图片

除少数情况之外,不应该加太多图片到文档中。仔细查看文档中的每个图片,然后问自己:

  • 它有用吗?
  • 它是否增强了文档?
  • 如果删除它,读者会错过这张图片吗?

如果回答否,那么移除图片。

另一方面,如果你绝对不能没有图片,就让它变成响应式的。这样,图片就会自动调整以适应更小的屏幕。

如果你仍然不确定图片是否应该出现,Opensource.com 社区版主 Ben Cotton 提供了一个关于在文档中使用屏幕截图的极好的解释

最后的想法

通过少量努力,你就可以构建适合移动设备用户的文档。此外,这些更改也改进了桌面计算机和笔记本电脑用户的文档体验。


via: https://opensource.com/article/17/12/think-mobile

作者:Scott Nesbitt 译者:MjSeven 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

熟悉了 复制命令,下一个相关的命令就是 mv 命令。当你想要将文件从一个位置移动到另一个地方并且不想复制它,那么mv 命令是完成这个任务的首选。

初识 mv 命令

mv 命令是一个与cp类似的命令,但是它并非创建文件或目录的复制品/副本。不管你在使用什么版本的Linux系统,mv 都默认安装在你的Linux系统上了。来看一下 mv 命令在日常操作中的一些例子。

1.移动文件

移动文件时需要注意的是文件的源地址和目标地址必须不同。这里有个例子,想要将file\_1.txt文件从当前目录移动到其它目录,以/home/pungki/为例,语法应该如下:

$ mv file_1.txt /home/pungki/office

mv command

如我们所见,当我们移动 file\_1.txt 文件时,先前目录的 file\_1.txt 就被删除了

2.移动多个文件

如果想一次移动多个文件,我们可以将他们放在一行并用空格分开。

$ mv file_2.txt file_3.txt file_4.txt /home/pungki/office

Move multiple files

如果你的文件有规律可循的话那么你就可以使用通配符。比如,为了移除所有以.txt为扩展名的文件,我们可以用下面的命令:

$ mv *.txt /home/pungki/office

Move using pattern

3.移动目录

不同于复制命令,用 mv 命令移动目录相当直接。移动目录你可以使用不带选项的 mv 命令。看下面的截图就一目了然了。

Moving directory

4.重命名文件或目录

我们也用 mv 命令来重命名文件或目录。不过目标位置和源位置必须相同才可以。然后文件名必须不同。

假定我们当前所在目录为/home/pungki/Documents,而我们想将file\_1.txt重命名为file\_2.txt。那么命令应该如下:

$ mv file_1.txt file_2.txt

如果是绝对路径,它应该像下面这样:

$ mv /home/pungki/Documents/file_1.txt /home/pungki/Documents/file_2.txt

Renaming file

5. 重命名目录

上一段的规则同样适用于目录。请看这个例子:

$ mv directory_1/ directory_2/

Renaming directory

6. 打印移动信息

当你移动或重命名一大堆文件或目录时,你可能会想在不去目标位置去查看的情况下知道你自己的命令是否成功地执行了。这就要用到-v选项了。

$ mv -v *.txt /home/pungki/office

mv with verbose mode

该方法同样适用于目录。

mv directory with verbose mode

7. 使用交互模式

当你将文件移动到其它位置,而那个位置恰好有同样的文件,这时 mv 命令会覆盖掉原来的文件。对于mv的这一行为一般不会有什么提示。如果想产生一个关于覆盖文件的提示,我们可以使用-i选项。(译注:通常发行版会通过alias命令,将-i作为默认选项,所以会有提示。)

假设我们想将 file\_1.txt 移动到 /home/pungki/office。同时,/home/pungki/office 目录下已经有file\_1.txt文件了。

$ mv -i file_1.txt /home/pungki/office

mv with interactive mode

这个提示会让我们知道目标位置处file\_1.txt的存在。如果我们按y键,那么那个文件将会被删除,否则不会。

8. 使用更新选项

-i 选项会提示我们关于覆盖文件的提示,而 -u 则只在源文件比目标文件新时才执行更新。让我们看一看下面的例子:

Update only newer

假如 file\_1.txt 和 file\_2.txt有如下特点:

File_1.txt has 84 bytes file size and it last modified time is 12:00
File_2.txt has 0 bytes file size and it last modified time is 11:59

我们想将它们移动到 /home/pungki/office 目录下。但是目标地址已经有file\_1.txt和file\_2.txt了。

我们用下面的命令将file\_1.txt 和file\_2.txt从当前目录移动到/home/pungki/office

$ mv -uv *.txt /home/pungki/office

可以看到这些文件被移动了。能移动这些文件是因为它们最近的修改时间戳比 /home/pungki/office 目录中的文件新。

9.不要覆盖任何已存在的文件

如果-i选项询问我们是否要覆盖文件,那么 -n 选项将不会允许我们覆盖任何已存在的文件。

继续使用第8点中的例子,如果我们将-u 换成 -n同时加上-v选项,那么我们会看到没有任何文件移动到了 /home/pungki/office 目录下。

$ mv -vn *.txt /home/pungki/office

No overwrite

10. 复制时创建备份

默认情况下,移动文件将会覆盖已存在的目标文件。但是如果我们移动错了文件而目标文件已经被新的文件覆盖了,这时应该怎么办才好呢?有没有一种方法可以恢复之前的文件呢?答案是肯定的。我们可以用-b选项。该选项会在新文件覆盖旧文件时将旧文件做备份。这里我们还以第8点为例。

$ mv -bv *.txt /home/pungki/office

Backup option

如截图中所见,在 /home/pungki/office 目录下出现了名为file\_1.txt~file\_2.txt~ 的文件。那个波浪符号(~)意味着这些文件是备份文件。从它们的属性中我们可以看到,这些文件比file\_1.txt和file\_2.txt要旧。

11. 无条件覆盖已经存在的文件

(译注:这一节是译者补充的,原文遗漏了这个重要选项)

当你希望无论如何都覆盖已经存在的文件或目录时,你可以使用 -f 选项。如果同时指定了 -f 选项和 -i 或 -n 选项,则 -f 选项会覆盖它们——即不进行任何提示而覆盖,所以,在使用此参数时,知道你在做什么。

$ mv -f *.txt /home/pungki/office

总结

移动文件和目录命令是Linux系统的基本命令。通常你可以通过man mv 或者 mv --help显示mv的手册页以了解更多详细信息。


via: http://linoxide.com/linux-command/mv-command-linux/

译者:Linchenguang 校对:wxy

本文由 LCTT 原创翻译,Linux中国 荣誉推出