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
このコードは、sh
POSIXに似たすべてのシェルで動作します。
答え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
あなたの場合は使用しませんが、さまざまなアプローチを見ることは常に興味深いものです。