ディレクトリではなくファイルを別のフォルダ/親フォルダに移動する方法を教えてください。
私はいくつかの.mp3ファイルがサブフォルダの6つのレベルの深さに埋め込まれている、非常に醜いフォルダ構造を持っています。
私は、Ubuntuを使用して、サブディレクトリをまったく持たずに、1つのディレクトリにすべてのファイル(ほとんどの場合.mp3がすべてではない)を作成したいと考えています。
助けて?
そのためには、端末を開いて次のコマンドを実行します。
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コマンドで指定されたディレクトリのみを意味します。2
、3
を使ってテストすることもできます。詳細な説明はUbuntu findマンページ を参照してください。
find /src/dir -type f -exec mv --backup=numbered -t /dst/dir {} +
このコマンドは/src/dir
の下のすべての通常ファイル(すべてのサブディレクトリを含む)を見つけ、コマンドmv
を使用してそれらを/dst/dir
に移動します。ディレクトリを自分のものに置き換えるだけです。同じ名前のファイルは自動的に名前変更されます。
MP3ファイルだけを移動したい場合は、-iname "*.mp3"
の後にfind
コマンドに-type f
オプションを追加します。
C0devの応答の2番目のコマンドだけが質問に答えます。以下は、この回答と比較してどうですか。ポイント3.と4.は、他の返信でもここと同じ方法で解決できます。
mv
を除き、-exec +
を使用したソリューションでは、xargs
やparallel
などの追加のコマンドを呼び出してファイル名を2回渡す必要はありません。--backup=numbered
のおかげで自動的にリネームされます。残念ながら、~3~
のような接尾辞を持つこれらのバックアップは、デフォルトではほとんどのファイル管理で隠されています。残念ながらmv
はサフィックスの変更を許可していませんが、追加のコマンドで簡単に後処理することができます。これはGNU拡張子です。-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
のそのような実装はわからない)、{}
の前にオプションの終わりを示す標識--
を付ける必要があります。
残念ながら、私はマークされた解決策についてコメントするのに十分高い評判を持っていません。しかし、私は私が遭遇した問題について他の人に警告したいと思いました。とても素人です。しかし、いくつかのことをしているとき、最初は頭に浮かぶことはないかもしれません。うまくいけば、それは他人を助けるでしょう。
コマンドを開始した後に、以下のメッセージの変形が提供されました。その後、コマンドは複数のファイルを作成します。
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
ディレクトリに戻しました。
ターミナルを開き、ファイルのあるフォルダのフォルダに移動し、find . -mindepth 2 -type f -print -exec mv {} . \;
を実行してこれらのサブディレクトリから現在のファイルにすべてのファイルを移動します。
私のワンライナー - これは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番目の部分では、サブディレクトリが空かどうかをチェックし(それらは今は:-)になっているはずです)それらを削除しますのでサブディレクトリなしでここにすべてが入ります。