現在のサブフォルダー内のすべてのファイルをここに移動する方法


8

私もいくつかのサブフォルダーを含む50のフォルダーを持っており、合計で1000以上のオーディオファイルがあります。すべてのサブフォルダーを削除し、すべてのファイルを現在のレベルに配置する必要があります。試したmv */* ./が、不満:引数リストが長すぎる

回答:


7

オーディオファイルの拡張子は.mp3だと思います

find <AudioFolderPath> -name '*.mp3' -exec mv -it <YourTargetFolder> {} +

ノート:

  • .mp3オーディオファイルの拡張子に置き換えます

  • <AudioParentFolderPath>サブフォルダーを含む親フォルダーに置き換えます。

  • <YourTargetFolder>すべてのファイルを配置する必要があるフォルダーパスに置き換え ます。

  • 異なるサブフォルダーの2 つのファイルが同じ名前の場合、1つだけが移動されます。

編集:として、コスタスは言った:「-iスイッチが作るmvインタラクティブ、それは既存のファイルを上書きする前にプロンプトが表示されます」


「-t」を使用すると、最初に宛先を指定できますか?(ここでは「mv」にこのオプションがないので、最初に移動先のフォルダを配置し、次にそこに移動するファイルのリストを配置する場合にのみ想定できますが、そうでない場合、これはすべてに適合しようとします最後のファイル名で警告を出す)tは「ターゲット」の可能性がありますか?
Olivier Dulac

はい、あなたが言った-tように、最初に目的地を指定することを許可します。mvマニュアルページから: -t, --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY
Muhammad

1
これはGNU mvのオプションであり、すべてのuniceで利用できるわけではないことに注意してください(少なくとも一部の実稼働環境では)。私はよりポータブルなソリューションを提供しますが、あなたのソリューションはLinuxでうまく機能します
Olivier Dulac

はい@OlivierDulac、あなたは正しい、あなたのメモに感謝します。
ムハンマド

4
find . -type f -mindepth 2 -exec mv -t ./ {} +

このコマンドは、同じ名前のファイルを上書きすることに注意してください。これを使用して、上書きする前にプロンプ​​トを表示できます。

find . -type f -mindepth 2 -exec mv -it ./ {} +

説明

  • -type f :通常のファイルのみを検索します。
  • -mindepth 2 :サブディレクトリ内のファイルのみを検索します。
  • -exec mv -it ./ {}-exec「見つかったすべてのファイルに対してこのコマンドを実行する」という意味です。{}ファイル名に置き換えられます。-iスイッチを作るmvインタラクティブ、それは既存のファイルを上書きする前にプロンプトが表示されますと-tにターゲットディレクトリを設定します./
  • +:で動作することができますシェルとして非常に多くの(1引数の行で)一緒にファイルを置くコマンド呼び出すためのコマンド(ない一つ一つが、いくつかの1つ)最小時間を。

さらに空のフォルダーを削除する場合は、同じレシーピーを使用できます。

find . -type d -empty -delete

1
-type fシンボリックリンク、名前付きパイプなどを除いて、プレーンファイルのみを選択します。ディレクトリ以外のすべてのファイルを移動するには、次のようにします! -type d
jimmij 2015

@jimmijオーディオファイルを名前付きパイプなどに保存する人はだれもいないと思います。シンボリックリンクについて心配する場合は、-Lパラメーター
Costas

1
-i標準で、-tGNU-のみ(単にカーネルは、いくつかのGNUおよび非GNUシステムで見ているのLinuxとは何の関係も)ありません
ステファンChazelas

@StéphaneChazelasに同意します:-t一部のシステムには存在しません(それほど古くないAIXのように)
Olivier Dulac

@OlivierDulac全員を満足させる決定を見つけることはほとんど不可能なので、さまざまなバリアントを歓迎します。文字列の変更を禁止する人は誰もいませんfind . -type f -mindepth 2 -exec mv {} ./ \;
Costas

2

はい、これはexecve()、外部コマンドの実行時にシステムコールに渡される引数と環境の累積サイズの制限です。

ではzsh、あなたはその組み込みを使用することができますmv代わりに:

zmodload -F zsh/files +b:zf_mv
zf_mv ./*/* .

またはzargs、リストを管理可能なチャンクに分割するために使用します。

autoload zargs
zargs -Ifiles ./*/* -- mv files .

ksh93

command -x mv ./*/* .

GNUの場合xargs、およびが組み込まれmvているシェルを使用したGNUの場合printf(ほとんどmkshは注目すべき例外です)

printf '%s\0' ./*/* | xargs -r0 mv -t .

OPはディレクトリではなくファイルのみを移動したいので、そのことに注意する必要があることに注意してください。ではzsh場合、あなたは、いくつか置くことができグロブ予選、例えば(.)または(^/)最後の後に*
jimmij 2015

0

非常にポータブルなソリューションは次のとおりです。

すべてのサブフォルダ内のすべてのファイルを検索し、現在のディレクトリに移動します

find ./*/ -type f -print | xargs mv -i "{}" ./

あなたが| egrep "\.au$|\.mp3$|\.ac3$"見つけたファイルがオーディオ拡張子を持つファイルであることを確認するために中間に追加することができます(すべてのタイプをカバーするために必要なだけの拡張子を追加します、私は3つの一般的なものを提供します)


あなたの場合、電話する必要はまったくありませんfind。ちょうど十分echoprintf
コスタ

@Costas:OPは、「*」を展開できないほど多くのファイルがあると言及しています...ここでは、50個のフォルダー名を展開するだけで、残りはxargsによって処理されます
Olivier Dulac

しかしfind、問題を解決しないでxargsください。
コスタ2015
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.