linux - with - terminal cp




如何讓cp命令創建任何必要的文件夾以將文件複製到目標 (7)

這個問題在這裡已經有了答案:

當使用cp將文件複製到可能存在或不存在的文件夾時,如何在必要時使cp創建文件夾? 這是我所嘗試過的:

[[email protected] nutch-0.9]# cp -f urls-resume /nosuchdirectory/hi.txt
cp: cannot create regular file `/nosuchdirectory/hi.txt': No such file or directory

rsync工作!

#file:
rsync -aqz _vimrc ~/.vimrc

#directory:
rsync -aqz _vim/ ~/.vim

令人驚訝的是,在這個線程中我看不到正確的答案,只需使用:

cp -r /foo/bar/baz /tmp

像往常一樣,一個簡單的RTFM建議就足夠了,上面的代碼會將baz文件複製到/ tmp和子目錄foo / bar下(如果它們不存在,將會創建它們)

cp --help
-R, -r, --recursive          copy directories recursively

如果以下兩個條件都成立:

  1. 您正在使用cp的GNU版本(而不是,例如Mac版本)和
  2. 您正在復制某些現有的目錄結構,您只需要重新創建它

那麼你可以用cp--parents標誌來做到這一點。 從信息頁面(可在http://www.gnu.org/software/coreutils/manual/html_node/cp-invocation.html#cp-invocationinfo cpman cp查看):

--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:

          cp --parents a/b/c existing_dir

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

例:

/tmp $ mkdir foo
/tmp $ mkdir foo/foo
/tmp $ touch foo/foo/foo.txt
/tmp $ mkdir bar
/tmp $ cp --parents foo/foo/foo.txt bar
/tmp $ ls bar/foo/foo
foo.txt

對於那些使用Mac OSX的人來說,解決這個問題的最簡單的方法就是使用ditto (儘管在Mac上是AFAIK)。 它將創建目標中缺少的目錄結構。

例如,我做到了

ditto 6.3.2/6.3.2/macosx/bin/mybinary ~/work/binaries/macosx/6.3.2/

在運行該命令之前, ~/work沒有包含二進製文件目錄。

我認為rsync應該類似地工作,但它似乎只適用於缺少目錄的一個級別。 那是,

rsync 6.3.3/6.3.3/macosx/bin/mybinary ~/work/binaries/macosx/6.3.3/

因為〜/ work / binaries / macosx存在,但不是〜/ work / binaries / macosx / 6.3.2 /


沒有這樣的選擇。 你可以做的是在復製文件之前運行mkdir -p

我製作了一個非常酷的腳本,可以用來在不存在的位置複製文件

#!/bin/bash
if [ ! -d "$2" ]; then
    mkdir -p "$2"
fi
cp -R "$1" "$2"

現在保存它,給它權限並使用它

./cp-improved SOURCE DEST

我把-R選項,但它只是一個草案,我知道它可以,你會改善它在很多方面。 希望它可以幫助你


為了擴展Christian的答案,唯一可行的方法是將mkdircp結合起來:

mkdir -p /foo/bar && cp myfile "$_"

順便說一句,當你只需要在現有的層次結構中創建一個目錄時, rsync就可以在一個操作中完成。 事實上,我非常喜歡rsync作為更多功能的cp替代品:

rsync -a myfile /foo/bar/ # works if /foo exists but /foo/bar doesn't.  bar is created.

cp -Rvn /source/path/* /destination/path/
cp: /destination/path/any.zip: No such file or directory

它將在目標中創建沒有現有路徑,如果路徑中有源文件。 這不會創建空目錄。

剛才我見過xxxxxxxx:沒有這樣的文件或目錄,因為我用完了空閒空間。 沒有錯誤信息。

同上:

ditto -V /source/path/* /destination/path
ditto: /destination/path/any.zip: No space left on device

一旦釋放空間cp -Rvn /source/path/* /destination/path/按預期工作







cp