複数のディレクトリへの一括コピー

複数のディレクトリへの一括コピー

ディレクトリに約9000個のファイルがあり、残りを無視してファイル名順に100個のディレクトリの90個のファイルにmvしたい。ファイル名 X からファイル名 Y に複数のファイルをコピーしますか?カレブ書いたコメント:

単にバッチ処理することが目的であれば、はるかに簡単な方法があります。ls | xargs -iX -n20 cp X target_folder/すべての処理が完了するまで、20 個のファイルごとに cp を実行します。

では、xargs の使用に基づいて、target_folder を切り替えて新しいフォルダーを作成し、コマンドを 100 回ループするにはどうすればよいでしょうか?

答え1

bash、次のコードを試してください。

#!/bin/bash

c=0

for f; do
    if ! ((c % 100)); then
        folder=folder_$(printf "%03d\n" $c)
        mkdir -p $folder
    fi

    [[ -d "$f" ]] || mv "$f" "$folder"
    ((c++))
done

次のようにスクリプトを実行します:

./script.bash *

答え2

そのコマンドは、あなたがしようとしていることに近いようには見えません。 はxargs役立ちますが、ファイル名に空白や引用符が含まれていないことがわかっていない限り、使用するのは面倒です。 以下は、ディレクトリごとに 90 個のファイルを新しく作成されたサブディレクトリにディスパッチするシェル ループです。

set -- *
# Set args to "$1" "$2" ... "$90"
i=1 args=
while [ $i -le 90 ]; do
  slice="$slice \"\${$i}\""
  i=$((i+1))
done
# Move files 90 at a time
i=0
while [ $# -ge 90 ]; do
  mkdir part$i
  eval "mv $slice part$i"
  shift 90
done
# 0 to 89 files remain in the current directory

答え3

parallel複数のコマンドの実行をサポートし\;{#}シーケンス番号です。

ls|parallel -n90 mkdir {#}\;mv {} {#}

または、ファイル名にスペース、引用符、またはバックスラッシュが含まれていない場合:

i=1;while read l;do mkdir $i;mv $l $((i++));done< <(ls|xargs -n90)

関連情報