不用 mv 命令也能移動檔案的方法
有時當你需要移動一個檔案時,mv 似乎不是最佳選項,那麼你會如何做呢? |
不起眼的 mv 是在你見過的每個 POSIX 系統中都能找到的有用工具之一。它的作用是明確定義的,並且做得很好:將檔案從檔案系統中的一個位置移動到另一個位置。但是 非常靈活,還有其他移動檔案的辦法。使用不同的工具可以完美匹配一些特殊用例,這算一個小優勢。
在遠離 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/foo 7476868 example/foo
作為測試,將檔案從示例目錄移動到當前目錄,然後檢視檔案的屬性:
$ mv example/foo . $ ls -l -G -g --inode 7476868 -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 --inode 7476869 -rwxrwxr-x. 29545 Aug 2 11:58 foo $ trash example/foo
示例中的新 foo 檔案獲得了 755 許可權,因為此處的 umask 明確排除了寫入許可權。
$ umask 0002
有關 umask 的更多資訊,閱讀 Alex Juarez 這篇關於檔案許可權的文章。
與複製和刪除類似,使用 cat(或 tac)命令在建立“移動”檔案時分配不同的許可權。假設當前目錄中是一個沒有 foo 的新測試環境:
$ cat example/foo > foo $ ls -l -G -g --inode 7476869 -rw-rw-r--. 29545 Aug 8 12:21 foo $ trash example/foo
這次,建立了一個沒有事先設定許可權的新檔案,所以檔案最終許可權完全取決於 umask 設定,它不會阻止使用者和組的許可權位(無論 umask 是什麼,都不會為新檔案授予可執行許可權),但它會阻止其他人的寫入(值為 2)。所以結果是一個許可權是 664 的檔案。
rsync 命令是一個強大的多功能工具,用於在主機和檔案系統位置之間傳送檔案。此命令有許多可用選項,包括使其目標映象成為源。
你可以使用帶有 --remove-source-files 選項的 rsync 複製,然後刪除檔案,並可以帶上你選擇執行同步的任何其他選項(常見的通用選項是 --archive):
$ rsync --archive --remove-source-files example/foo . $ ls example bar baz $ ls -lGgi 7476870 -rwxrwxrwx. 1 seth users 29545 Aug 8 12:23 foo
在這裡,你可以看到保留了檔案許可權和所有權,只是更新了時間戳,並刪除了原始檔。
警告:不要將此選項與 --delete 混淆,後者會從目標目錄中刪除(源目錄中不存在的)檔案。誤用 --delete 會清除很多資料,建議你不要使用此選項,除非是在測試環境中。
你可以覆蓋其中一些預設值,更改許可權和修改設定:
$ rsync --chmod=666 --times \ --remove-source-files example/foo . $ ls example bar baz $ ls -lGgi 7476871 -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 命令有很多選項,包括 --backup 和 --compare 命令(以避免更新檔案的新副本)。
與 cp 和 cat 命令不同,但與 mv 完全相同,install 命令可以在複製檔案的同時而保留其時間戳:
$ install --preserve-timestamp example/foo . $ ls -l -G -g --inode 7476869 -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 -li 7476869 -rw-rw-rw-. 1 skenlon dialout 29545 Aug 2 07:28 foo $ trash example/foo
檔案包含資料,而真正重要的檔案包含你的資料。學會聰明地管理它們是很重要的,現在你有了確保以你想要的方式來處理資料的工具包。
你是否有不同的資料管理方式?在評論中告訴我們你的想法。
via:
作者:Seth Kenlon 選題:lujun9972 譯者:MjSeven 校對:wxy
本文由 LCTT 原創編譯,Linux中國 榮譽推出
原文地址:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31559985/viewspace-2658925/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- mv 命令 – 移動或改名檔案
- 在不使用 mv 命令的情況下移動檔案
- 那些不用js也能實現的效果JS
- Linux 移動或重新命名檔案/目錄-mv 的10個實用例子Linux
- 不用下載也能製作投票活動的工具使用教程!
- 移動檔案
- 用prebuild mv 方法遷移資料Rebuild
- Sqlserver移動檔案路徑move datafile的三種方法SQLServer
- 不會設計主圖也沒關係,不用自己動手排版也能設計!
- 不用安裝docker也能構建docker映象Docker
- 深究mv移動資料夾時`/`的用法
- Linux mv命令Linux
- python——批次移動檔案Python
- Oracle歸檔檔案丟失導致OGG不用啟動Oracle
- 【liunx命令】上傳下載檔案的方法
- SQLServer移動資料檔案SQLServer
- python之批次移動檔案Python
- 良許 | 從命令列同時移動多個檔案型別的小技巧命令列型別
- css在移動端常遇到的檔案CSS
- Linux基礎命令---mvLinux
- 徹底解決梯度爆炸問題,新方法不用反向傳播也能訓練ResNet梯度反向傳播
- 在 Linux 中如何移動檔案Linux
- python移動檔案指標seekPython指標
- 一款開源的檔案搜尋神器,終於不用記 find 命令了
- 也許可以不用 If… Else
- Linux 中複製和移動檔案Linux
- 函式:file.move 移動檔案函式
- 橫向無檔案移動--SCshell使用
- 【ASM】ASM資料檔案和OS檔案(FILESYSTEM)轉移方法總結ASM
- 連root也幹不掉的檔案
- 潦草手寫體也能輕鬆識別,快速提取文字不用愁
- 由mv命令引發的對inode的思考
- 沒有基礎也能學好Python的方法?Python
- 保姆級的介面自動化教程,從思路到操作步驟,不用寫程式碼也能2小時搞定
- Linux下mv命令高階用法Linux
- 用 Laravel 遷移檔案新增表註釋的一種方法Laravel
- PostgreSQL在不同的表空間移動資料檔案SQL
- Linux:檔案解壓、複製和移動的若干坑Linux