ディレクトリには次の名前のファイルがあります。
01.txt 02.txt 03.txt
同じディレクトリのフォルダ名は次のとおりです。
01.abc 02.def 03.ghi
ファイルをフォルダに 1 つずつコピーするコマンドが必要です。つまり、01.txt
is in 01.abc
、02.txt
is in 02.def
、03.txt
is in です03.ghi
。このコマンドは、フォルダ名を考慮せずにフォルダを上から下にファイルで埋める必要があります(フォルダごとに1つのファイル)。
とても感謝しています!
編集1:
コードを変更しましたファイルを複数のフォルダに移動する[閉じる]次のように:
#!/bin/bash
LISTFILESCMD='ls *.txt'
FQUANTITY=1
FOLDERLIST=`seq -w 1 3`
for FOLDER in $FOLDERLIST; do mv `$LISTFILESCMD | head -n $FQUANTITY` $FOLDER; done
その結果、これら3つのファイルは3番目のフォルダに配置されます。
編集2:
いいえ、FQUANTITY = 3の場合、ファイルは最初のフォルダに移動します。
上記のスクリプトはFQUANTITY = 1のときに機能します。ただし、ファイル名やフォルダ名にスペースが含まれていると正しく動作しません。
ファイル名のスペースにも機能する2番目のスクリプトを作成しましたが、ファイル名にドットが含まれている場合にのみ対応し、フォルダ名にスペースが含まれている場合、このスクリプトは機能しません。フォルダ名にスペースが含まれている場合やファイル名にドットが含まれていない場合でも、それを機能させる方法があると思います。
#!/bin/bash
array1=(*/) # folder
array2=(*.*) # file
for ((i=0;i<${#array2[@]};++i)); do
mv "${array2[i]}" "${array1[i]}"
done
ありがとうございます!
答え1
その結果、これら3つのファイルは3番目のフォルダに配置されます。
最初のフォルダを言っていますか?合計3つのファイルしかない場合、fquantity = 3を選択するのはなぜですか?フォルダあたりのファイル数です!
forループをテストしましたが、これまで動作します。ディレクトリ全体にファイルを均等に展開するには、正しい「量」を選択する必要があります。
あなたのQは、あなたが提供したファイル名と数量のために実際に理解するのが少し難しいです。そして:01.txtは01.abcに属しますが、「名前は考慮しないでください」。
17のフォルダに移動する必要がある3000のファイルがあるとします。または、xフォルダ、各フォルダの最大数は次のとおりです。ファイルが200個?これは最初のステップ、簡単な数学、カウンターを持つループになります。
以下は、「堅牢性」(スペース)とパフォーマンス、および「プログラム」を単純化するために標準コマンドを使用する方法に関する質問です。
あなたの例:
for FOLDER in $FOLDERLIST; do mv `$LISTFILESCMD | head -n $FQUANTITY` $FOLDER; done
ファイルのリストが不要なので、ある点ではエレガントです。残り(移動されていない)ファイル。そして、一つの大きなコマンドで各フォルダを一度だけ埋めれば良いので、十分に速くなければなりませんmv
。
(fquantity)の正しいパラメータを選択することで、head
必要に応じて7つのファイルを3つのディレクトリに移動できます。 ---私は3-3-1が欲しいと思いました。ただし、数量「7」を選択すると、最初のディレクトリにある7つのファイルがすべてインポートされます。 「1」を使用すると、1-1-1と移動されていない4つのファイルが作成されます。理想的な状況は3-2-2です。したがって、関連する数学はそれほど単純ではないかもしれません。
しかし、空白のあるファイル名は移動されず、mv
作成者は驚くほど次のように言いました。ああ、宇宙の問題だと思います。。
答え2
配列ソリューションは、スペースを含むファイルでも機能する必要があります。した拡張子を正しく引用してください。ただし、ダッシュで始まるファイル名に問題が発生する可能性がありますが、mv -- file dir/
これを防ぐことができます(または代わりに./
ワイルドカードの前に配置するなど)。./*
*
ファイルを選択する方法については、Bashで直接実行できる方法はないと思います(しかしzshでは実行できます)。ただし、すべてのリストを選択してそのリストから一般ファイルをフィルタリングすることはできます。
#!/bin/bash
dirs=(*/) # directories
tmp=(*) # everything
files=() # files
for f in "${tmp[@]}"; do
if [ -f "$f" ]; then
files+=("$f")
fi
done
for ((i=0 ; i < ${#dirs[@]} ; ++i)); do
mv -- "${files[i]}" "${dirs[i]}"
done