web-dev-qa-db-ja.com

ネストしたサブディレクトリからファイルをubuntuの別のフォルダに移動するにはどうすればいいですか? (多くのサブフォルダを取り除こうとしている)

ディレクトリではなくファイルを別のフォルダ/親フォルダに移動する方法を教えてください。

私はいくつかの.mp3ファイルがサブフォルダの6つのレベルの深さに埋め込まれている、非常に醜いフォルダ構造を持っています。

私は、Ubuntuを使用して、サブディレクトリをまったく持たずに、1つのディレクトリにすべてのファイル(ほとんどの場合.mp3がすべてではない)を作成したいと考えています。

助けて?

34
Chris

askubuntu-QAにすばらしい答えがあります

そのためには、端末を開いて次のコマンドを実行します。

mv  -v ~/Downloads/* ~/Videos/

すべてのファイルとフォルダをDownloadsフォルダからVideosフォルダに移動します。


フォルダではなくすべてのファイルを移動する:

しかし、DownloadsフォルダからVideosフォルダにすべてのファイル(フォルダは除く)を移動したい場合は、このコマンドを使用します。

find ~/Downloads/ -type f -print0 | xargs -0 mv -t ~/Videos

ダウンロードフォルダからのみファイルを移動し、サブフォルダからは移動しない:

ダウンロードフォルダからすべてのファイルを移動したいが、ダウンロードフォルダ内のフォルダ内のファイルは移動しない場合は、次のコマンドを使用します。

find ~/Downloads/ -maxdepth 1 -type f -print0 | xargs -0 mv -t ~/Videos

ここで、-maxdepthオプションは検索の深さを指定します。1はfindコマンドで指定されたディレクトリのみを意味します。 23を使ってテストすることもできます。

詳細な説明はUbuntu findマンページ を参照してください。

出典

45
Christian Wörz

溶液

find /src/dir -type f -exec mv --backup=numbered -t /dst/dir {} +

このコマンドは/src/dirの下のすべての通常ファイル(すべてのサブディレクトリを含む)を見つけ、コマンドmvを使用してそれらを/dst/dirに移動します。ディレクトリを自分のものに置き換えるだけです。同じ名前のファイルは自動的に名前変更されます。

移動するファイルを選択する

MP3ファイルだけを移動したい場合は、-iname "*.mp3"の後にfindコマンドに-type fオプションを追加します。

C0devによる返信との比較

C0devの応答の2番目のコマンドだけが質問に答えます。以下は、この回答と比較してどうですか。ポイント3.と4.は、他の返信でもここと同じ方法で解決できます。

  1. mvを除き、-exec +を使用したソリューションでは、xargsparallelなどの追加のコマンドを呼び出してファイル名を2回渡す必要はありません。
  2. 他の応答は同じ名前を持つファイルを静かに上書きします。ここでファイルはオプション--backup=numberedのおかげで自動的にリネームされます。残念ながら、~3~のような接尾辞を持つこれらのバックアップは、デフォルトではほとんどのファイル管理で隠されています。残念ながらmvはサフィックスの変更を許可していませんが、追加のコマンドで簡単に後処理することができます。これはGNU拡張子です。
  3. -print0とは反対に、-exec command {} +はIEEE Std 1003.1(POSIX)、ISO/IEC 9945およびThe Single UNIX Specification規格の一部です。したがって、より移植性があるはずです。 IEEE Std 1003.1、2004年版IEEE Std 1003.1、2013年版 を参照してください。 and 0000243: "find"に-print0を追加します 。しかし、とにかく必要なmv-tスイッチはGNU拡張子なので、コマンド全体をPOSIXシステム間で移植することはできません。

注:find-で始まるパスを生成できる場合(現時点ではfindのそのような実装はわからない)、{}の前にオプションの終わりを示す標識--を付ける必要があります。

12
pabouk

残念ながら、私はマークされた解決策についてコメントするのに十分高い評判を持っていません。しかし、私は私が遭遇した問題について他の人に警告したいと思いました。とても素人です。しかし、いくつかのことをしているとき、最初は頭に浮かぶことはないかもしれません。うまくいけば、それは他人を助けるでしょう。

問題

コマンドを開始した後に、以下のメッセージの変形が提供されました。その後、コマンドは複数のファイルを作成します。

mv: `/data/share/docs/src/dir/filename.ext' and `/data/share/docs/src/dst/filename.ext' are the same file

原因

/src/dstの親です(例:/src/../dst/)。

溶液

もっと良い解決策があるかもしれませんが、ファイルを自分の/srcの外側の一時ディレクトリに移動してから、コマンドを再実行してそれらを最終的に入れたい/src/../dstディレクトリに戻しました。

2
MackAltman

ターミナルを開き、ファイルのあるフォルダのフォルダに移動し、find . -mindepth 2 -type f -print -exec mv {} . \;を実行してこれらのサブディレクトリから現在のファイルにすべてのファイルを移動します。

1
lion

私のワンライナー - これはMac上で動作しますが、どの* nixでも動作するはずです。親ディレクトリから開始します。

# Move files to parent and delete empty folders
find . -not -type d -print0 | xargs -0J % mv -f % . ; find . -type d -depth -print0 | xargs -0 rm -rf

最初の部分では、すべてのサブフォルダから実際のフォルダに、コマンドを見た場所からすべてを移動します。 2番目の部分では、サブディレクトリが空かどうかをチェックし(それらは今は:-)になっているはずです)それらを削除しますのでサブディレクトリなしでここにすべてが入ります。

1
X-File