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の場合(主に注目すべき例外):mv
printf
mksh
printf '%s\0' ./*/* | xargs -r0 mv -t .
答え4
かなり移植可能なソリューションは次のとおりです。
各サブフォルダ内のすべてのファイルを見つけ、現在のディレクトリに移動します。
find ./*/ -type f -print | xargs mv -i "{}" ./
| egrep "\.au$|\.mp3$|\.ac3$"
途中に1つを追加することで、見つかったファイルがオーディオ拡張子を持つファイルであることを確認できます(すべてのタイプをカバーするために必要なだけ拡張子を追加します。私は3つの一般的な拡張子のみを提供しました)。