2012-01-26 8 views
4

こんにちは、私はUNIXのコマンドラインに関する質問があります。私はこれらのような多くのファイルを持っている:異なる父のフォルダに含まれる多数のファイル(同じ名前)をコピーします。

/f/f1/file.txt 

/f/f2/file.txt 

/f/f3/file.txt 

and so on... 

私は次のように別のフォルダグラムにその父親フォルダでコピーすべてfile.txtが欲しい:

/g/f1/file.txt 

/g/f2/file.txt 

/g/f3/file.txt 

私はすべてのコンテンツをコピーすることはできませんfolder fそれぞれにはsub-folder f1, f2, ...がありますので、コピーしたくないファイルがたくさんあります。

これをコマンドラインでどのように行うことができますか?最終的にbashスクリプトを使用していますか?

ありがとうございました!

答えて

6

マニュアルには、このオプションを示し

[jaypal:~/Temp/f] tree 
. 
├── f1 
│   ├── file.txt # copy this file only with parent directory f1 
│   ├── file1.txt 
│   └── file2.txt 
└── f2 
    ├── file.txt # copy this file only with parent directory f2 
    ├── file1.txt 
    └── file2.txt 

2 directories, 6 files 
[jaypal:~/Temp/f] mkdir ../g 
[jaypal:~/Temp/f] shopt -s globstar 
[jaypal:~/Temp/f] for file in ./**/file.txt; do cp --parents "$file" ../g ; done 
[jaypal:~/Temp/f] tree ../g 
../g 
├── f1 
│   └── file.txt 
└── f2 
    └── file.txt 

2 directories, 2 files 
+0

ありがとうございました! これは私の望むように機能します! 他の回答ありがとうございます! – fibon82

+0

@ fibon82:これはおそらくあなたの特定のケースでは最も簡単ですが、特に複雑な場合には非常に強力なので、rsyncを念頭に置いてください。 – Karolos

+0

OK Karolos。あなたの提案にも感謝します! – fibon82

2

のtarファイルを対処するため、時には便利です:小規模なテストを参照してください。あなたを助けるために起こっているよう

kent$ tree t g 
t 
|-- t1 
| |-- file 
| `-- foo ---->####this file we won't copy 
|-- t2 
| `-- file 
`-- t3 
    `-- file 
g 

3 directories, 4 files 

kent$ cd t 

kent$ find -name "file"|xargs tar -cf - | tar -xf - -C ../g 

kent$ tree ../t ../g 
../t 
|-- t1 
| |-- file 
| `-- foo 
|-- t2 
| `-- file 
`-- t3 
    `-- file 
../g 
|-- t1 
| `-- file 
|-- t2 
| `-- file 
`-- t3 
    `-- file 
+0

+1私は 'move'ため' tar'を使用して思ったことはありません。優れた!説明は非常にはっきりしています;-) – olibre

1

これがそうです:

find /f/ -name file.txt -execdir cp -R . /g/ \; 

それはではfile.txtという名前のすべてのファイルを検索しますディレクトリ/ f /にコピーし、execdir(一致するファイルを含むディレクトリで実行)を使用して、ファイルを含むディレクトリをディレクトリ/ g /にコピーします。あなたがbash v4上にある場合、あなたはこのような何かを行うことができますので、

--parents 
       use full source file name under DIRECTORY 

- - cpため

+0

私がコマンドを理解する限り、相対パスを保存せずに/ g /にファイルをコピーします。 /g/f1/file.txtにコピーし、既存のfile.txtを上書きします。つまり、最後にコピーされた_last_を/ g /に保存します。私は何か見落としてますか? – Karolos

+0

はい、そうです。私は 'cp'から' cp -R'に投稿を編集しました。これは明らかにディレクトリをコピーすると意味があります。 –

+0

私はこの問題が-Rに関連しているとは思わない。私はあなたのコードをMac OS X(BSD unix)上で走らせ、最終的なファイル名に対応する名前をつけて、ファイルの結合を/ g /で終わらせました。 – Karolos

2

rsyncを見てみましょう。あなたが「/」であると仮定すると、

rsync -r f/ g/ --include "*/" --include "*/file.txt" --exclude "*" 

は、最初のサブディレクトリの中を見(および除外し、最後に対抗)するためにrsyncを伝えることが必要である含まれています。 2番目のインクルードは、コピーするファイルを選択します。 excludeは、/ fで処理されていない他のファイルが、必要なパターンではないことを確認します。

注:シンボリックリンクがある場合、--copy-linksを指定しない限り、rsyncはリンクをコピーし、リンク先のファイルはコピーしません。

例:

$ find f g -type f 
f/f1/file.txt 
f/f1/fileNew.txt 
f/f2/file.txt 
f/f3/file.txt 
find: g: No such file or directory 
$ rsync -r f/ g/ --include "*/" --include "*/file.txt" --exclude "*" 
$ find f g -type f 
f/f1/file.txt 
f/f1/fileNew.txt 
f/f2/file.txt 
f/f3/file.txt 
g/f1/file.txt 
g/f2/file.txt 
g/f3/file.txt 
関連する問題