1つのディレクトリにある複数のフォルダに複数のファイルがあり、それらは1つのフォルダにある必要があります。これを達成するのに役立つコマンドラインはありますか?
find
+ xargs
+ mv
を使用:
find . -type f -print0 | xargs -0 -I file mv --backup=numbered file .
これにより、現在の作業ディレクトリとそのサブディレクトリ内のすべてのファイルが(再帰的に)現在の作業ディレクトリに移動され、同じファイル名のファイルが上書きされないように、同じファイル名のファイルに番号が付けられます。
それぞれ1
、2
、および3
を含む1.ext
、2.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
ディレクトリ構造が次のように見える場合
dir root
- dir A
- ファイルする
- ファイルb
- dir B
- ファイルc
- ファイルd
等々
あなたは簡単にできます
mv **/* .
深さ1のすべてのファイルをルートディレクトリに移動します。シンプルでエレガント!
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 {} +
次のコマンドを使用できます。
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.