在不使用 mv 命令的情況下移動樂動體育檔案

2021-09-29 18:09:34 字數 3535 閱讀 2174

有時當你需要移動乙個檔案時,mv 命令似乎不是最佳選項,那麼你會如何做呢?

不起眼的 mv 命令是在你見過的每個 posix 系統中都能找到的有用工具之一。它的作用是明確定義的,並且做得很好:將檔案從檔案系統中的乙個位置移動到另乙個位置。但是 linux 非常靈活,還有其他移動檔案的辦法。使用不同的工具可以完美匹配一些特殊用例,這算乙個小優勢。

在遠離 mv 之前,先看看這個命令的預設結果。首先,建立乙個目錄並生成一些許可權為 777 的檔案:

$ mkdir example

$ touch example/

$ for i in example/; do ls /bin > 「$」; done【樂動體育fv222.com】

$ 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 明確排除了寫入許可權。

檢視和刪除

與複製和刪除類似,使用 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

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 實際上是一種將檔案放在你想要地方的有用方法。

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:

linux下mv命令移動目錄的二種情況

mv 移動目錄分為2種情況 第一種 目標目錄為空,使用mv命令可以直接移動,使用絕對路徑執行或加引數 f 不會提示是否移動。1 2 3 4 5 root localhost mkdir 1 root localhost mkdir tmp 1 root localhost mv 1 tmp mv o...

如何在不使用try語句的情況下檢視檔案是否存在

如果你要確定檔案存在的話然後做些什麼,那麼使用try是最好不過的 如果您不打算立即開啟檔案,則可以使用os.path.isfile檢查檔案 如果path是現有常規檔案,則返回true。對於相同的路徑,islink 和isfile 都可以為true import os.path os.path.isf...

c 學習memcpy 在各種情況下的使用

一共有四種情況使用memcpy,對於使用 還是不適用什麼時候使用一直很困惑,雖然現在仍未全部清除,不過初步已經了解一些。果然還是對指標不熟悉,否則會理解的更好。int res2 5 int res2 dest 5 for int i 0 i 5 i memcpy res2 dest,res2,5 s...