ディレクトリを作成し、ループを介してそのディレクトリにファイルを移動します。

ディレクトリを作成し、ループを介してそのディレクトリにファイルを移動します。

N個のファイルを含むディレクトリを考えてみましょう。

ファイルをアルファベット順にリストし、次のようにリストを保存できます。

ls > list

その後、同じディレクトリにn個のサブディレクトリを作成したいと思います。

mkdir direc{1..n}

listそれでは、最初のm個または最初の5個(1-5)個のファイルをからに移動し、次のdirec15個のファイル(例えば6-10)をに移動したいと思いますdirec2

これはあなたに些細なことのように思えるかもしれませんが、私は現在それをすることはできません。助けてください。

ベストアンサー1

list=(*)     # an array containing all the current file and subdir names
nd=5         # number of new directories to create
((nf = (${#list[@]} / nd) + 1))  # number of files to move to each dir
                                 # add 1 to deal with shell's integer arithmetic

# brace expansion doesn't work with variables due to order of expansions
echo mkdir $(printf "direc%d " $(seq $nd))

# move the files in chunks
# this is an exercise in arithmetic to get the right indices into the array
for (( i=1; i<=nd; i++ )); do
    echo mv "${list[@]:(i-1)*nf:nf}" "direc$i"
done

テスト後、「echo」コマンドをすべて削除します。

または、各ディレクトリに固定数のファイルを含めるには、次の方が簡単です。

list=(*)
nf=10
for ((d=1, i=0; i < ${#list[@]}; d++, i+=nf)); do
    echo mkdir "direc$d"
    echo mv "${list[@]:i:nf}" "direc$d"
done

おすすめ記事