ファイルではなくフォルダのみをコピーしますか?


16

ディレクトリ全体をコピーする方法はありますが、フォルダのみをコピーしますか?ディレクトリのどこかに破損したファイルがあるため、ハードディスクが故障します。

したがって、破損したファイルを別のハードディスクにコピーするのではなく、フォルダーをコピーしたかったのです。何百ものフォルダーを検索するスクリプトがあり、それらをすべて手動で作成する必要がないためです。

cpマニュアルを検索しましたが、何も表示されませんでした(見逃したかもしれません)

故障したHDDに次の構造があるとします。

dir1
    files
    dir2
        files
        files
        dir4
dir3
files

欲しいのはディレクトリ構造だけで、ファイルはまったくありません。

だから私は新しいHDDで終わるでしょう:

dir1
    dir2
        dir4
dir3

誰かがいくつかのトリックを知っていることを願っています!


ディレクトリ構造をコピーするだけなのか、それとも現在の作業ディレクトリ内のファイルを除外するだけなのか(そして、より深いサブディレクトリ内の他のすべてのファイルはゲームです)?
オリ

例を追加しました。混乱して申し訳ありません
シャノン

1
参考rsyncまでに、ディレクトリ構造をコピーし、アクセス許可と属性を保持するために使用します](stackoverflow.com/a/9242883/52074)。プレーンを使用mkdir -p しても、権限と属性は保持されません
トレバーボイドスミス

回答:


15

ディレクトリスケルトンをミラーリングし、ファイルをコピーしない場合:

find -type d -links 2 -exec mkdir -p "/path/to/backup/{}" \;

何が起きてる:

  • 検索はディレクトリのみを選択しています
  • 可能な限り深いディレクトリ-links 2を見つけるために使用しています。
  • mkdir -p 途中で不足しているディレクトリが作成されます。

呼び出しのfind -type d -exec mkdir -p "/path/to/backup/{}" \;全体的な負荷を削減するためではなく、このように実行しましたmkdir。少しのテストでこれをすぐに証明できます。以下に、2つのコマンドを比較するために実行したテストツリーを示します。

$ tree
.
├── dir1
│   ├── dir2
│   │   └── dir3
│   ├── dir7
│   └── dir8
└── dir9
    └── dir0

$ pr -m -t <(find -type d) <(find -type d -links 2)
.                               ./dir1/dir8
./dir1                          ./dir1/dir2/dir3
./dir1/dir8                     ./dir1/dir7
./dir1/dir2                     ./dir9/dir0
./dir1/dir2/dir3
./dir1/dir7
./dir9                  
./dir9/dir0 

そして、それは数千のディレクトリを備えた実際の単語のソリューションでのみ良くなるでしょう。


これは私が初心者ですが、バックアップにコピーするために古いディレクトリをどのように検索していますか?ここでは1つのパスしか見ることができません
シャノン

パスを指定しない場合find、現在の作業ディレクトリを開始点として使用します。:あなたは構文別のパスの使用を使用したい場合はfind /path/to/search/ -type.....
オリ

だから私はディレクトリをコピーして実行したいスケルトンを含む特定のフォルダに設定しましたがfind -type d -exec mkdir -p "/media/jinglez/TVSeries/TV Series"/{}" \;、すべては大丈夫でしょうか?しばらく時間がかかっているようです:/
シャノン

これを通常のターミナルから実行しますか?
シャノン

1
どちらもfindのexec句に固有です。{}は、現在の「見つかった」ファイル名と\;を意味します。句を終了するための単なるエスケープです。それの外見により、あなたのコードには余分な「」があります、私はきっと...読むべきです:find -type d -links 2 -exec mkdir -p "/media/jinglez/TVSeries/TV Series/{}" \;
オリ

2

Pythonのワンライナーで非常に簡単に行えます:

bash-4.3$ tree
.
├── ABC
├── set_pathname_icon.py
├── subdir1
│   ├── file1.abc
│   └── file2.abc
├── subdir2
│   ├── file1.abc
│   └── file2.abc
└── subdir3
    └── subdir4
        └── file1.txt

4 directories, 7 files
bash-4.3$ python -c 'import os,sys;dirs=[ r for r,s,f in os.walk(".") if r != "."];[os.makedirs(os.path.join(sys.argv[1],i)) for i in dirs]' ~/new_destination
bash-4.3$ tree ~/new_destination
/home/xieerqi/new_destination
├── subdir1
├── subdir2
└── subdir3
    └── subdir4

スクリプトとして、これは次のように書き換えられます。

#!/usr/bin/env python
import os,sys
dirs=[ r for r,s,f in os.walk(".") if r != "."]
for i in dirs:
    os.makedirs(os.path.join(sys.argv[1],i)) 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.