互いに依存する2つの変数を持つForループを使用する方法は?

互いに依存する2つの変数を持つForループを使用する方法は?

100個の.mp4ファイルを含むホームディレクトリがあります。また、dir_1, dir_2, dir_3最大100個のサブディレクトリセットがあります。私が望むのは、メインディレクトリを繰り返して、.mp4ファイルをサブフォルダごとに1つずつ、すべてのサブフォルダに展開することです。その後、できるだけ2つのループまたは2つの変数を持つ1つのループが必要です。これが約1行のコードで達成しようとする目標です。

for file in *.mp4 & x in {1..100}; do mv $file dir_$x; done

答え1

set -- *.mp4

for dir in dir_*/; do
    mv -- "$1" "$dir"
    shift
done

すべてのMP4ファイルの名前を場所引数リストに割り当てることから始めますset。その後、パターンに一致するディレクトリを繰り返しますdir_*/。各ディレクトリの場所パラメータリストの最初のMP4ファイルをディレクトリに移動し、MP4ファイルをリストから移動します。

上記のコードには、MP4ファイルと同じくらい多くのディレクトリがあることを確認するチェックはありません。あなたはそれを望んであなたはできます

set -- *.mp4

for dir in dir_*/; do
    if [ "$#" -eq 0 ]; then
        echo 'Ran out of MP4 files' >&2
        exit 1
    fi
    mv -- "$1" "$dir"
done

if [ "$#" -ne 0 ]; then
    echo 'Too many MP4 files' >&2
    exit 1
fi

このコードは、shPOSIXに似たすべてのシェルで動作します。

答え2

算術式を使用してカウンタをインクリメントするには、ループを使用します。

x=1
for file in *.mp4 ; do
    mv -- "$file" dir_$x/
    ((++x))
done

mp4名にはスペースを含めることができるので、ファイル名を二重引用符で囲みます。ファイル名がダッシュで始まる場合、--ダッシュを前に使用すると、"$file"ファイル名がオプションのセットとして解釈されるのを防ぎます。

答え3

別の種類の攻撃性:

#!/bin/bash

mp4=( ./*.mp4 )
for i in "${!mp4[@]}"
do
    mv "${mp4[i]}" "dir_$i/"
done

あなたの場合は使用しませんが、さまざまなアプローチを見ることは常に興味深いものです。

関連情報