自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

在Linux中如何移動(dòng)文件

系統(tǒng) Linux
在 Linux 中移動(dòng)文件看似比較簡(jiǎn)單,但是可用的選項(xiàng)卻比大多數(shù)人想象的要多。本文介紹了初學(xué)者如何在 GUI 和命令行中移動(dòng)文件,還介紹了底層實(shí)際上發(fā)生了什么,并介紹了許多有一定經(jīng)驗(yàn)的用戶也很少使用的命令行選項(xiàng)。

[[277757]]

無(wú)論你是剛接觸 Linux 的文件移動(dòng)的新手還是已有豐富的經(jīng)驗(yàn),你都可以通過(guò)此深入的文章中學(xué)到一些東西。

在 Linux 中移動(dòng)文件看似比較簡(jiǎn)單,但是可用的選項(xiàng)卻比大多數(shù)人想象的要多。本文介紹了初學(xué)者如何在 GUI 和命令行中移動(dòng)文件,還介紹了底層實(shí)際上發(fā)生了什么,并介紹了許多有一定經(jīng)驗(yàn)的用戶也很少使用的命令行選項(xiàng)。

移動(dòng)什么?

在研究移動(dòng)文件之前,有必要仔細(xì)研究移動(dòng)文件系統(tǒng)對(duì)象時(shí)實(shí)際發(fā)生的情況。當(dāng)文件創(chuàng)建后,會(huì)將其分配給一個(gè)索引節(jié)點(diǎn)inode,這是文件系統(tǒng)中用于數(shù)據(jù)存儲(chǔ)的固定點(diǎn)。你可以使用 ls 命令看到文件對(duì)應(yīng)的索引節(jié)點(diǎn):

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

移動(dòng)文件時(shí),實(shí)際上并沒(méi)有將數(shù)據(jù)從一個(gè)索引節(jié)點(diǎn)移動(dòng)到另一個(gè)索引節(jié)點(diǎn),只是給文件對(duì)象分配了新的名稱或文件路徑而已。實(shí)際上,文件在移動(dòng)時(shí)會(huì)保留其權(quán)限,因?yàn)橐苿?dòng)文件不會(huì)更改或重新創(chuàng)建文件。(LCTT 譯注:在不跨卷、分區(qū)和存儲(chǔ)器時(shí),移動(dòng)文件是不會(huì)重新創(chuàng)建文件的;反之亦然)

文件和目錄的索引節(jié)點(diǎn)并沒(méi)有暗示這種繼承關(guān)系,而是由文件系統(tǒng)本身決定的。索引節(jié)點(diǎn)的分配是基于文件創(chuàng)建時(shí)的順序分配的,并且完全獨(dú)立于你組織計(jì)算機(jī)文件的方式。一個(gè)目錄“內(nèi)”的文件的索引節(jié)點(diǎn)號(hào)可能比其父目錄的索引節(jié)點(diǎn)號(hào)更低或更高。例如:

  1. $ mkdir foo
  2. $ mv example.txt foo
  3. $ ls --inode
  4. 7476865 foo
  5. $ ls --inode foo
  6. 7344977 example.txt

但是,將文件從一個(gè)硬盤驅(qū)動(dòng)器移動(dòng)到另一個(gè)硬盤驅(qū)動(dòng)器時(shí),索引節(jié)點(diǎn)基本上會(huì)更改。發(fā)生這種情況是因?yàn)楸仨殞⑿聰?shù)據(jù)寫入新文件系統(tǒng)。因此,在 Linux 中,移動(dòng)和重命名文件的操作實(shí)際上是相同的操作。無(wú)論你將文件移動(dòng)到另一個(gè)目錄還是在同一目錄使用新名稱,這兩個(gè)操作均由同一個(gè)底層程序執(zhí)行。

本文重點(diǎn)介紹將文件從一個(gè)目錄移動(dòng)到另一個(gè)目錄。

用鼠標(biāo)移動(dòng)文件

圖形用戶界面是大多數(shù)人都熟悉的友好的抽象層,位于復(fù)雜的二進(jìn)制數(shù)據(jù)集合之上。這也是在 Linux 桌面上移動(dòng)文件的首選方法,也是最直觀的方法。從一般意義上來(lái)說(shuō),如果你習(xí)慣使用臺(tái)式機(jī),那么你可能已經(jīng)知道如何在硬盤驅(qū)動(dòng)器上移動(dòng)文件。例如,在 GNOME 桌面上,將文件從一個(gè)窗口拖放到另一個(gè)窗口時(shí)的默認(rèn)操作是移動(dòng)文件而不是復(fù)制文件,因此這可能是該桌面上最直觀的操作之一:

 

Moving a file in GNOME.

而 KDE Plasma 桌面中的 Dolphin 文件管理器默認(rèn)情況下會(huì)提示用戶以執(zhí)行不同的操作。拖動(dòng)文件時(shí)按住 Shift 鍵可強(qiáng)制執(zhí)行移動(dòng)操作:

 

Moving a file in KDE.

在命令行移動(dòng)文件

用于在 Linux、BSD、Illumos、Solaris 和 MacOS 上移動(dòng)文件的 shell 命令是 mv。不言自明,簡(jiǎn)單的命令 mv <source> <destination> 會(huì)將源文件移動(dòng)到指定的目標(biāo),源和目標(biāo)都由絕對(duì)相對(duì)文件路徑定義。如前所述,mvPOSIX 用戶的常用命令,其有很多不為人知的附加選項(xiàng),因此,無(wú)論你是新手還是有經(jīng)驗(yàn)的人,本文都會(huì)為你帶來(lái)一些有用的選項(xiàng)。

但是,不是所有 mv 命令都是由同一個(gè)人編寫的,因此取決于你的操作系統(tǒng),你可能擁有 GNU mv、BSD mv 或 Sun mv。命令的選項(xiàng)因其實(shí)現(xiàn)而異(BSD mv 根本沒(méi)有長(zhǎng)選項(xiàng)),因此請(qǐng)參閱你的 mv 手冊(cè)頁(yè)以查看支持的內(nèi)容,或安裝你的首選版本(這是開(kāi)源的奢侈之處)。

移動(dòng)文件

要使用 mv 將文件從一個(gè)文件夾移動(dòng)到另一個(gè)文件夾,請(qǐng)記住語(yǔ)法 mv <source> <destination>。 例如,要將文件 example.txt 移到你的 Documents 目錄中:

  1. $ touch example.txt
  2. $ mv example.txt ~/Documents
  3. $ ls ~/Documents
  4. example.txt

就像你通過(guò)將文件拖放到文件夾圖標(biāo)上來(lái)移動(dòng)文件一樣,此命令不會(huì)將 Documents 替換為 example.txt。相反,mv 會(huì)檢測(cè)到 Documents 是一個(gè)文件夾,并將 example.txt 文件放入其中。

你還可以方便地在移動(dòng)文件時(shí)重命名該文件:

  1. $ touch example.txt
  2. $ mv example.txt ~/Documents/foo.txt
  3. $ ls ~/Documents
  4. foo.txt

這很重要,這使你不用將文件移動(dòng)到另一個(gè)位置,也可以重命名文件,例如:

  1. $ touch example.txt
  2. $ mv example.txt foo2.txt
  3. $ ls foo2.txt`

移動(dòng)目錄

不像 cp 命令,mv 命令處理文件和目錄沒(méi)有什么不同,你可以用同樣的格式移動(dòng)目錄或文件:

  1. $ touch file.txt
  2. $ mkdir foo_directory
  3. $ mv file.txt foo_directory
  4. $ mv foo_directory ~/Documents

安全地移動(dòng)文件

如果你移動(dòng)一個(gè)文件到一個(gè)已有同名文件的地方,默認(rèn)情況下,mv 會(huì)用你移動(dòng)的文件替換目標(biāo)文件。這種行為被稱為清除clobbering,有時(shí)候這就是你想要的結(jié)果,而有時(shí)則不是。

一些發(fā)行版將 mv 別名定義為 mv --interactive(你也可以自己寫一個(gè)),這會(huì)提醒你確認(rèn)是否覆蓋。而另外一些發(fā)行版沒(méi)有這樣做,那么你可以使用 --interactive-i 選項(xiàng)來(lái)確保當(dāng)兩個(gè)文件有一樣的名字而發(fā)生沖突時(shí)讓 mv 請(qǐng)你來(lái)確認(rèn)。

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

如果你不想手動(dòng)干預(yù),那么可以使用 --no-clobber-n。該選項(xiàng)會(huì)在發(fā)生沖突時(shí)靜默拒絕移動(dòng)操作。在這個(gè)例子當(dāng)中,一個(gè)名為 example.txt 的文件以及存在于 ~/Documents,所以它不會(huì)如命令要求從當(dāng)前目錄移走。

  1. $ mv --no-clobber example.txt ~/Documents
  2. $ ls
  3. example.txt

帶備份的移動(dòng)

如果你使用 GNU mv,有一個(gè)備份選項(xiàng)提供了另外一種安全移動(dòng)的方式。要為任何沖突的目標(biāo)文件創(chuàng)建備份文件,可以使用 -b 選項(xiàng)。

  1. $ mv -b example.txt ~/Documents
  2. $ ls ~/Documents
  3. example.txt    example.txt~

這個(gè)選項(xiàng)可以確保 mv 完成移動(dòng)操作,但是也會(huì)保護(hù)目錄位置的已有文件。

另外的 GNU 備份選項(xiàng)是 --backup,它帶有一個(gè)定義了備份文件如何命名的參數(shù)。

  • existing:如果在目標(biāo)位置已經(jīng)存在了編號(hào)備份文件,那么會(huì)創(chuàng)建編號(hào)備份。否則,會(huì)使用 simple 方式。
  • none:即使設(shè)置了 --backup,也不會(huì)創(chuàng)建備份。當(dāng) mv 被別名定義為帶有備份選項(xiàng)時(shí),這個(gè)選項(xiàng)可以覆蓋這種行為。
  • numbered:給目標(biāo)文件名附加一個(gè)編號(hào)。
  • simple:給目標(biāo)文件附加一個(gè) ~,當(dāng)你日常使用帶有 --ignore-backups 選項(xiàng)的 ls 時(shí),這些文件可以很方便地隱藏起來(lái)。

簡(jiǎn)單來(lái)說(shuō):

  1. $ mv --backup=numbered example.txt ~/Documents
  2. $ ls ~/Documents
  3. -rw-rw-r--. 1 seth users 128 Aug  1 17:23 example.txt
  4. -rw-rw-r--. 1 seth users 128 Aug  1 17:20 example.txt.~1~

可以使用環(huán)境變量 VERSION_CONTROL 設(shè)置默認(rèn)的備份方案。你可以在 ~/.bashrc 文件中設(shè)置該環(huán)境變量,也可以在命令前動(dòng)態(tài)設(shè)置:

  1. $ VERSION_CONTROL=numbered mv --backup example.txt ~/Documents
  2. $ ls ~/Documents
  3. -rw-rw-r--. 1 seth users 128 Aug  1 17:23 example.txt
  4. -rw-rw-r--. 1 seth users 128 Aug  1 17:20 example.txt.~1~
  5. -rw-rw-r--. 1 seth users 128 Aug  1 17:22 example.txt.~2~

--backup 選項(xiàng)仍然遵循 --interactive-i 選項(xiàng),因此即使它在執(zhí)行備份之前創(chuàng)建了備份,它仍會(huì)提示你覆蓋目標(biāo)文件:

  1. $ mv --backup=numbered example.txt ~/Documents
  2. mv: overwrite '~/Documents/example.txt'? y
  3. $ ls ~/Documents
  4. -rw-rw-r--. 1 seth users 128 Aug  1 17:24 example.txt
  5. -rw-rw-r--. 1 seth users 128 Aug  1 17:20 example.txt.~1~
  6. -rw-rw-r--. 1 seth users 128 Aug  1 17:22 example.txt.~2~
  7. -rw-rw-r--. 1 seth users 128 Aug  1 17:23 example.txt.~3~

你可以使用 --force-f 選項(xiàng)覆蓋 -i

  1. $ mv --backup=numbered --force example.txt ~/Documents
  2. $ ls ~/Documents
  3. -rw-rw-r--. 1 seth users 128 Aug  1 17:26 example.txt
  4. -rw-rw-r--. 1 seth users 128 Aug  1 17:20 example.txt.~1~
  5. -rw-rw-r--. 1 seth users 128 Aug  1 17:22 example.txt.~2~
  6. -rw-rw-r--. 1 seth users 128 Aug  1 17:24 example.txt.~3~
  7. -rw-rw-r--. 1 seth users 128 Aug  1 17:25 example.txt.~4~

--backup 選項(xiàng)在 BSD mv 中不可用。

一次性移動(dòng)多個(gè)文件

移動(dòng)多個(gè)文件時(shí),mv 會(huì)將最終目錄視為目標(biāo):

  1. $ mv foo bar baz ~/Documents
  2. $ ls ~/Documents
  3. foo   bar   baz

如果最后一個(gè)項(xiàng)目不是目錄,則 mv 返回錯(cuò)誤:

  1. $ mv foo bar baz
  2. mv: target 'baz' is not a directory

GNU mv 的語(yǔ)法相當(dāng)靈活。如果無(wú)法把目標(biāo)目錄作為提供給 mv 命令的最終參數(shù),請(qǐng)使用 --target-directory-t 選項(xiàng):

  1. $ mv --target-directory=~/Documents foo bar baz
  2. $ ls ~/Documents
  3. foo   bar   baz

當(dāng)從某些其他命令的輸出構(gòu)造 mv 命令時(shí)(例如 find 命令、xargsGNU Parallel),這特別有用。

基于修改時(shí)間移動(dòng)

使用 GNU mv,你可以根據(jù)要移動(dòng)的文件是否比要替換的目標(biāo)文件新來(lái)定義移動(dòng)動(dòng)作。該方式可以通過(guò) --update-u 選項(xiàng)使用,在BSD mv 中不可用:

  1. $ ls -l ~/Documents
  2. -rw-rw-r--. 1 seth users 128 Aug  1 17:32 example.txt
  3. $ ls -l
  4. -rw-rw-r--. 1 seth users 128 Aug  1 17:42 example.txt
  5. $ mv --update example.txt ~/Documents
  6. $ ls -l ~/Documents
  7. -rw-rw-r--. 1 seth users 128 Aug  1 17:42 example.txt
  8. $ ls -l

此結(jié)果僅基于文件的修改時(shí)間,而不是兩個(gè)文件的差異,因此請(qǐng)謹(jǐn)慎使用。只需使用 touch 命令即可愚弄 mv

  1. $ cat example.txt
  2. one
  3. $ cat ~/Documents/example.txt
  4. one
  5. two
  6. $ touch example.txt
  7. $ mv --update example.txt ~/Documents
  8. $ cat ~/Documents/example.txt
  9. one

顯然,這不是最智能的更新功能,但是它提供了防止覆蓋最新數(shù)據(jù)的基本保護(hù)。

移動(dòng)

除了 mv 命令以外,還有更多的移動(dòng)數(shù)據(jù)的方法,但是作為這項(xiàng)任務(wù)的默認(rèn)程序,mv 是一個(gè)很好的通用選擇?,F(xiàn)在你知道了有哪些可以使用的選項(xiàng),可以比以前更智能地使用 mv 了。 

責(zé)任編輯:龐桂玉 來(lái)源: Linux中國(guó)
相關(guān)推薦

2019-03-18 09:40:44

Linux命令編程語(yǔ)言

2021-08-13 15:00:40

Linux終端移動(dòng)文件

2018-06-01 10:37:26

Linux歸檔文件壓縮文件

2014-09-01 10:43:35

Linux

2021-01-19 08:07:50

Linux日期文件

2023-03-06 07:25:17

LinuxAdvanced

2021-02-26 14:20:35

LinuxWindowsexe文件

2012-02-06 13:26:09

2022-08-14 19:19:14

Linux

2018-01-08 15:30:18

Linux命令date

2013-12-30 10:43:15

云計(jì)算移動(dòng)數(shù)據(jù)云安全

2018-11-12 09:30:49

Linux命令文件管理器

2023-03-21 12:52:05

Linux創(chuàng)建文件

2009-05-26 12:23:56

Linux變量文件命名

2023-04-17 16:17:19

LinuxPDF

2016-11-17 12:46:45

2023-05-13 17:43:17

Linux文件文件夾

2021-08-16 13:34:07

Linux終端刪除文件

2022-04-06 10:34:09

Linux元數(shù)據(jù)

2011-07-07 17:30:25

iPhone Xcode
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)