web-dev-qa-db-ja.com

複数のディレクトリを1つにマージする方法

1つのディレクトリにある複数のフォルダに複数のファイルがあり、それらは1つのフォルダにある必要があります。これを達成するのに役立つコマンドラインはありますか?

2
Junior Cortez

find + xargs + mvを使用:

find . -type f -print0 | xargs -0 -I file mv --backup=numbered file .

これにより、現在の作業ディレクトリとそのサブディレクトリ内のすべてのファイルが(再帰的に)現在の作業ディレクトリに移動され、同じファイル名のファイルが上書きされないように、同じファイル名のファイルに番号が付けられます。

それぞれ12、および3を含む1.ext2.extおよび3.extサブフォルダーを持つtmpフォルダーのサンプル結果ファイル:

ubuntu@ubuntu:~/tmp$ tree
.
├── 1
│   ├── 1.ext
│   ├── 2.ext
│   └── 3.ext
├── 2
│   ├── 1.ext
│   ├── 2.ext
│   └── 3.ext
└── 3
    ├── 1.ext
    ├── 2.ext
    └── 3.ext

3 directories, 9 files
ubuntu@ubuntu:~/tmp$ find . -type f -print0 | xargs -0 -I file mv --backup=numbered file .
ubuntu@ubuntu:~/tmp$ tree
.
├── 1
├── 1.ext
├── 1.ext.~1~
├── 1.ext.~2~
├── 2
├── 2.ext
├── 2.ext.~1~
├── 2.ext.~2~
├── 3
├── 3.ext
├── 3.ext.~1~
└── 3.ext.~2~

3 directories, 9 files
3
kos

ディレクトリ構造が次のように見える場合

dir root

  • dir A
    • ファイルする
    • ファイルb
  • dir B
    • ファイルc
    • ファイルd

等々

あなたは簡単にできます

mv **/* .

深さ1のすべてのファイルをルートディレクトリに移動します。シンプルでエレガント!

1
Mong H. Ng

findを使用してこれを行うことができます:

find . -type f -exec mv -i -t new_dir {} +

最初に、すべてのファイルを移動するディレクトリ(mkdir new_dir)を作成します。ここでは、./new_dirディレクトリ内のすべてのファイルを移動します。

  • find . -type fは、現在のディレクトリの下のすべてのディレクトリの下にあるすべてのファイルを見つけるので、すべてのサブディレクトリを含むディレクトリにcdする必要があります。または、絶対パスを使用できます。 ~/foo/bar

  • find-exec述語は、見つかったすべてのファイルをnew_dirディレクトリに移動するmvコマンドを実行します。もう一度、絶対パスを使用できます。

  • mv -iは、ファイルを上書きする前にプロンプ​​トを表示します。

新しいディレクトリが他の場所にある場合は、絶対パスを使用します。

find ~/path/to/dir -type f -exec mv -i -t ~/path/to/new_dir {} +
0
heemayl

次のコマンドを使用できます。

find . -type f -execdir mv '{}' /parent-dir \;

man find

 -execdir utility [argument ...] ;
     The -execdir primary is identical to the -exec primary with the exception that 
     utility will be executed from the directory that holds the current
     file.  The filename substituted for the string ``{}'' is not qualified.
0
Maythux