cpを使用してさまざまなレベルのサブディレクトリを除外する方法は?

cpを使用してさまざまなレベルのサブディレクトリを除外する方法は?

これは私の元の投稿に関するフォローアップの質問です。find&cp コマンドは、最初のレベルのディレクトリをコピーしません。

次のディレクトリ構造があります。

test folders
├── 1
│   ├── 1-1
│   ├── 1-2
│   └── 1-3
├── 2
│   ├── 2-1
│   ├── 2-2
│   └── 2-3
├── 3
│   ├── 3-1
│   ├── 3-2
│   └── 3-3
└── 4
    ├── 4-1
    ├── 4-2
    └── 4-3

16 directories, 0 files

find&コマンドを使用して、cpすべてのサブフォルダーを除いて、最初のレベルのフォルダー1,2,3,4のみをコピーしようとしています。

├── 1
├── 2
├── 3
└── 4

作業ディレクトリはです/home/username/Downloads/test folders

失敗した試みはリンクされた質問にあります。そこで、withコマンドがcpvisibleであることを確認しました。find-maxdepth

ファイルを簡単にコピーできるfind別のコマンドはありますか? ifコマンドを接続できないのと同じ機能はありますか?cp-maxdepth-maxdepthcpfindcp

[編集]:また、最初のレベルのディレクトリである1、2、3、4だけをコピーしたいと思います。ファイルをコピーしたくありません。混乱させて申し訳ありません。

ベストアンサー1

ファイルやサブディレクトリをコピーせずにディレクトリのみをコピーしたい場合は、次のように簡単です。

terdon@oregano test folders $ tree
.
├── 1
│   ├── 1-1
│   ├── 1-2
│   ├── 1-3
│   ├── file-1
│   └── file-2
├── 2
│   ├── 2-1
│   ├── 2-2
│   ├── 2-3
│   ├── file-1
│   └── file-2
├── 3
│   ├── 3-1
│   ├── 3-2
│   ├── 3-3
│   ├── file-1
│   └── file-2
└── 4
    ├── 4-1
    ├── 4-2
    ├── 4-3
    ├── file-1
    └── file-2

17 directories, 8 files

上記の例では、次のコマンドを使用して最上位ディレクトリを再作成できます。

terdon@oregano test folders $ find . -maxdepth 1 -type d -exec mkdir ../results/{} \;
mkdir: cannot create directory ‘../results/.’: File exists
$ tree ../results/
../results/
├── 1
├── 2
├── 3
└── 4

5 directories, 0 files

このエラーメッセージは無視してかまいません。これは.、現在のディレクトリも探して、../results/.すでに存在する現在のディレクトリを作成しようとするためです。

トップレベルのファイルもコピーするには、次の2つの手順で実行できます。

terdon@oregano test folders $ find . -maxdepth 1 -type d -exec mkdir ../results/{} \;
mkdir: cannot create directory ‘../results/.’: File exists
$ find . -maxdepth 2 -type f -exec cp {} ../results/{} \;

次を生成します。

$ tree ../results/
../results/
├── 1
│   ├── file-1
│   └── file-2
├── 2
│   ├── file-1
│   └── file-2
├── 3
│   ├── file-1
│   └── file-2
└── 4
    ├── file-1
    └── file-2

次の方法で一度にこれを行うこともできます。

$ find . -maxdepth 1 -type d -exec sh -c 'mkdir ../results/$1 && cp {}/* ../results/$1' sh {} \;
mkdir: cannot create directory ‘../results/.’: File exists
cp: -r not specified; omitting directory './3/3-1'
cp: -r not specified; omitting directory './3/3-2'
cp: -r not specified; omitting directory './3/3-3'
cp: -r not specified; omitting directory './1/1-1'
cp: -r not specified; omitting directory './1/1-2'
cp: -r not specified; omitting directory './1/1-3'
cp: -r not specified; omitting directory './4/4-1'
cp: -r not specified; omitting directory './4/4-2'
cp: -r not specified; omitting directory './4/4-3'
cp: -r not specified; omitting directory './2/2-1'
cp: -r not specified; omitting directory './2/2-2'
cp: -r not specified; omitting directory './2/2-3'

cpなしで使用するため、-rファイルのみがコピーされます。これらの警告が表示されますが、無視してもかまいません。次にリダイレクトしてミュートすることもできます/dev/null

find . -maxdepth 1 -type d -exec sh -c 'mkdir ../results/$1 && cp {}/* ../results/$1' sh {} \; 2>/dev/null

おすすめ記事