あるフォルダから別のフォルダにファイルセットをコピーする必要があり、次のコマンドを使用します。
cp -rf `head -n 100 /home/tmp/abc.txt` /home/tmp/test/files
ファイルの内容はabc.txt
次のとおりです。
./folder1/example.tar.gz
./folder2/example.tar.gz
./folder3/example.tar.gz
ただし、上記のcp
コマンドを実行すると、次の結果が表示されます。
cp: will not overwrite just-created `/home/tmp/test/files/example.tar.gz' with `./folder3 /example.tar.gz'
cp: will not overwrite just-created `/home/tmp/test/files/example.tar.gz' with `./folder1/example.tar.gz'
.gzファイル名はエラーに示されているものと同じであるため理解できます。私が望むのは、/home/tmp/test/files
内部的にリストされているのと同じフォルダ構造を持つことですabc.txt
。たとえば、次のようになります。
/home/tmp/test/files/folder1/example.tar.gz
/home/tmp/test/files/folder2/example.tar.gz
/home/tmp/test/files/folder3/example.tar.gz
example.tar.gz
ただし、上記のコマンドを実行した後は、内部フォルダのみが取得されますcp
。
では、上記のことをどのように得ることができますか?
答え1
CPいいえ
コピーはディレクトリ構造をコピーせずにファイルのみをコピーするため、エラーメッセージが表示されるため、例は機能しません。これらの完全なコピーを実行するには、tar
コマンドと構文を使用するtar cvf - --files-from=... | (cd /home/tmp/test/files/; tar xvf -)
か、単にrsync
。
同期
私があなたなら、これを行いますrsync
。
$ rsync -avz --files-from=abc.txt /src /home/tmp/test/files/.
ファイルの最初の100行だけが必要な場合は、abc.txt
次のことができます。
$ rsync -avz --files-from=<(head -n 100 abc.txt) /src /home/tmp/test/files/.
はい
サンプルフォルダデータ:
$ tree /home/saml/tmp/folder*
/home/saml/tmp/folder1
`-- example.tar.gz
/home/saml/tmp/folder2
`-- example.tar.gz
/home/saml/tmp/folder3
`-- example.tar.gz
これでファイルをコピーします。
$ rsync -avz --files-from=<(head -n 3 /home/saml/tmp/abc.txt) \
/home/saml/tmp/. /home/saml/tmp/test/files/.
building file list ... done
./
folder1/
folder1/example.tar.gz
folder2/
folder2/example.tar.gz
folder3/
folder3/example.tar.gz
sent 3147093 bytes received 81 bytes 6294348.00 bytes/sec
total size is 3145728 speedup is 1.00
コピーされたことを確認してください。
$ tree /home/saml/tmp/test/files
/home/saml/tmp/test/files
|-- folder1
| `-- example.tar.gz
|-- folder2
| `-- example.tar.gz
`-- folder3
`-- example.tar.gz
アスファルト
興味がある場合は、使用方法は次のとおりですtar
。
$ cd /home/saml/tmp
$ tar cvf - --files-from=<(head -n 3 /home/saml/tmp/abc.txt) | (cd /home/saml/tmp/test/files/; tar xvf -)
./folder1/example.tar.gz
./folder1/example.tar.gz
./folder2/example.tar.gz
./folder2/example.tar.gz
./folder3/example.tar.gz
./folder3/example.tar.gz
コピーされたことを確認してください。
$ tree /home/saml/tmp/test/files
/home/saml/tmp/test/files
|-- folder1
| `-- example.tar.gz
|-- folder2
| `-- example.tar.gz
`-- folder3
`-- example.tar.gz
答え2
問題は、cp
ディレクトリ構造をコピーしないことです。もちろんです。 (cp -r
再帰的に)。
cp
少なくとも POSIX が実行しないことは、ターゲットcp
ディレクトリからソースオペランドの相対パスを再作成することです。
それからあなたはcp a/b/file1 a/b/file2 a/c/file3 dest
それを得ましたdest/file1 dest/file2 dest/file3
。
GNU Coreutilsを使用している場合は、cp
このオプションがあります--parents
。いつ導入されたのかは不明です。 GNUはこの経路再生成メカニズムを生成するようにcp --parents
促します。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.
したがって、GNUがある場合は再帰的ではないので、削除してcp
次のように変更する必要があります。-r
--parents
cp --parents -f `head -n 100 /home/tmp/abc.txt` /home/tmp/test/files