Linux技巧:cp命令自動創建不存在的目錄和只複製修改的文件


Linux技巧:cp命令自動創建不存在的目錄和只複製修改的文件

本篇文章介紹使用 Linux 的 cp 命令時,創建不存在的目錄和只複製修改過的文件的方法。

複製時自動創建不存在的子目錄

在 Linux 中,可以使用 cp 命令的 --path 選項指定在複製的時候自動創建不存在的子目錄。

例如執行下面的命令:

<code>$ cp --path java/com/server/Service.java target/
/<code>

如果 target 目錄下不存在 java/com/server/ 這一串子目錄,cp --path 命令會自動創建 java/com/server/ 這一串子目錄,然後把文件複製到對應的子目錄下。

注意:在上面命令中,target 目錄必須存在,才能複製。cp --path 命令只會自動創建源文件路徑包含的子目錄,不會自動創建所給的目標目錄。

從行為來看,cp --path java/com/server/Service.java target/ 命令類似於下面的命令:

<code>$ mkdir -p target/java/com/server/
$ cp java/com/server/Service.java target/java/com/server/
/<code>

mkdir -p 命令表示遞歸創建一串子目錄。

--parents 選項

查看 man cp 的說明,裡面沒有提到 --path 選項,但實際上可以使用這個選項。它應該是被廢棄了。

大概使用 --path 選項複製時,如果遇到報錯,提示的選項名是 --parents,應該是被 --parents 選項所替代:

<code>$ cp --path java/com/server/Service.java not_exist/
cp: with --parents, the destination must be a directory
Try 'cp --help' for more information.
/<code>

可以看到,cp --path 命令複製報錯,提示信息說是使用 --parents 時,目標文件名必須是一個已經存在的目錄。

可見,--path 被當成 --parents 來處理。

查看 GNU cp 的在線幫助鏈接 https://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html,對 --parents 選項說明如下:

--parents

Form the name of each destination file by appending to the target directory a slash and the specified name of the source file.

The last argument given to cp must be the name of an existing directory. For example, the command:

<code>    cp --parents a/b/c existing_dir
/<code>

copies the file a/b/c to existing_dir/a/b/c, creating any missing intermediate directories.

即,當被複制的源文件路徑包含子目錄名,--parent 選項會在目標目錄下自動創建不存在的子目錄。目標目錄本身必須已經存在。

由於在 cp 命令的幫助信息中已經找不到 --path 選項的說明,建議不再使用這個選項,改用 --parents 選項。

只複製新修改過或者不存在的文件

在 Linux 中,有時候會遇到這樣一個問題場景:使用 cp 命令複製一個很大的目錄(該目錄底下有很多子目錄或者文件),但是複製到中途時,遇到異常,導致停止複製,需要重新複製。

這個時候不希望複製已經複製過的文件,而是隻複製還沒有複製過的文件。那麼可以使用 cp 命令的 -u 選項。

查看 man cp 對 -u 選項說明如下:

-u, --update

copy only when the SOURCE file is newer than the destination file or when the destination file is missing.

即,只有源文件新於目標文件、或者目標文件不存在時,cp -u 命令才會複製這個文件。


分享到:


相關文章: