2017-05-24 19 views
0

フォルダの作成とファイルの移動に関するヘルプを探したいと思います。私はフォルダを作成し、特定の拡張子で終わるファイルと各フォルダ内の特定の数のファイルのみを配置したい。たとえば、10個のテキストファイルがあり、5つのフォルダが作成され、各フォルダには2つのファイルがあります。 (ファイルの名前は1.txt、2.txt、....、10.txtなので、1.txtと2.txtはフォルダ1に、3txtには4.txt、フォルダ2には4.txtが必要です。Bash Script - フォルダの作成とファイルの移動(各フォルダ内の特定のファイル数)

私のコードは次のようになります。

end=2 
sta=1 
for i in {1..5} 
do 
    mkdir "$i" 
    for file in *.txt: 
    do 
     mv "{$sta..$end}.txt" "$i" 
    done 
    end=$((end+2)) 
    begin=$((begin+2)) 

done 

それはそれのようになりますが、私はエラー、「MVを持っている:そのようなファイルやディレクトリはありません: 『{1..10} .txtファイルを』をstatできません」。

私はそれが簡単な変更になりますが、それを把握することができませんでした。私は、以前の質問を経てきたが、私のコードを並べ替えることができませんでした。

おかげで知っている!

答えて

0

としては、あなたが得るようhere

bashは、変数展開の前にブレース展開を行います指摘毎週 {0..4}です。結果は予測可能かつ安全であるため( ユーザー入力を信用してはいけません)、あなたはあなたのケースではevalを使用することができます。

$ WEEKS_TO_SAVE = 4
$ evalの「ます。mkdir -p毎週{0 .. $(( WEEKS_TO_SAVE))}」

注:

evalは慎重にここで悪の使用はevalで、$((..))整数式として評価される 変数を強制的に使用されています。

は、だからあなたの場合には使用のevalをすることができます:返信用

end=2 
sta=1 
for i in {1..5} 
do 
    mkdir -p "$i" 
    for file in *.txt: 
    do 
     eval "mv {$((sta))..$((end))}.txt $i" 
    done 
    end=$((end+2)) 
    sta=$((sta+2)) 
done 
+0

うん、それは魅力のように働いた...ありがとう – AsmaTahir

0

あなたは以下のようにのための算術代替バージョンを試すことができます。

((for i=1; i<=5; i++))

説明:あなたはそれを使用することはできませんので、ブレース展開は、{x..y}は、他の拡張の前に行われます可変長配列。

EDIT MVエラーが

#!/bin/bash 

count=$(ls -lrt *.txt | wc -l) 

for ((i=1;i<=$count/2;i++)) 
do 
mkdir $i 
a=$(find . -maxdepth 1 -name '*.txt' | cut -d'/' -f2 | sort -n|head -2) 
mv $a $i 
done 
+0

おかげで...私はディレクトリを作成することができていますが、指定したフォルダにファイルを移動することはできません。 – AsmaTahir

0

を解決した後にそれを試してみてください。

#!/bin/bash 

sta=1 
end=2 
countFileInFolder=2 
countFolders=5 
filePath='/tmp/txt' 
scriptDir=$(dirname $(readlink -f ${BASH_SOURCE})) 

# create files for test 
for ((k=1; k<=$(($countFolders*$countFileInFolder)); k++)); do 
    > "$filePath/$k.txt" 
done 

for ((i=1; i<=$countFolders; i++)); do 
    if [[ ! -d "$i" ]]; then mkdir "$i"; fi 
    for ((n=$sta; n<=$end; n++)); do 
    if [[ ! -f "$i" ]]; then mv "$filePath/$n.txt" "$scriptDir/$i"; fi 
    done 
    sta=$(($sta+$countFileInFolder)) 
    end=$(($end+$countFileInFolder)) 
done 
関連する問題