現在のサブフォルダ内のすべてのファイルを移動する方法については、こちらをご覧ください。

現在のサブフォルダ内のすべてのファイルを移動する方法については、こちらをご覧ください。

50個のフォルダと一部のサブフォルダに合計1000個を超えるオーディオファイルがあります。すべてのサブフォルダを削除し、すべてのファイルを現在のレベルに配置する必要があります。これを試しましたが、mv */* ./文句を言います:パラメータリストが長すぎます。

答え1

オーディオファイル拡張子が.mp3であるとします。

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

メモ:

  • .mp3オーディオファイル拡張子に置き換えてください。

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

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

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

編集する:〜のようにコスタス-iスイッチはmv対話型であり、既存のファイルを上書きする前にメッセージを表示します。」と言います。

答え2

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

このコマンドは、同じ名前のすべてのファイルを上書きします。上書きする前にメッセージを表示するためにこれを使用できます。

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

説明する

  • -type f:一般ファイルのみを検索します。
  • -mindepth 2:サブディレクトリにあるファイルのみを探します。
  • -exec mv -it ./ {}-exec「これを実行する」という意味注文する見つかった各ファイルに。"は、対話的{}にfilename.スイッチに置き換えられ、-i既存のmvファイルを上書きする前にメッセージを表示し、-tターゲットディレクトリを./
  • +:シェルが機能できるだけのファイルを1つの引数行にまとめます。注文する引用する注文する最小回数(一対一ではなく一対多)です。

空のフォルダをさらに削除するには、同じ受信方法を使用できます。

find . -type d -empty -delete

答え3

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

の場合、zsh組み込み関数をmv代わりに使用できます。

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

または、zargsリストを管理可能な塊に分割する方法を使用してください。

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

そしてksh93

command -x mv ./*/* .

シェルが組み込まれたGNUxargsとGNUの場合(主に注目すべき例外):mvprintfmksh

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

答え4

かなり移植可能なソリューションは次のとおりです。

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

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

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

関連情報