Bash脚本 - 创建文件夹并将文件移动到它(每个文件夹中的特定文件数)

时间:2017-05-24 09:40:07

标签: bash shell directory

我想就创建文件夹和将文件移动到其中的代码寻求帮助。我想创建文件夹,放置以特定扩展名结尾的文件,每个文件夹中只放置一定数量的文件。例如,我有10个文本文件,创建5个文件夹,每个文件夹有两个文件。 (文件的名称类似于1.txt,2.txt,....,10.txt。所以1.txt和2.txt应该在文件夹1中,3.txt和4.txt在文件夹2中,依此类推。

我的代码如下所示:

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':没有这样的文件或目录”。

我知道这将是一个简单的改变,但无法弄清楚。我已经完成了之前的问题,但无法对我的代码进行排序。

谢谢!

3 个答案:

答案 0 :(得分:0)

您可以尝试以下算术替换版本:

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

解释:大括号扩展,{x..y}在其他扩展之前执行,因此您不能将其用于可变长度序列。

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

答案 1 :(得分:0)

试一试:

{{1}}

答案 2 :(得分:0)

如指出here

  

bash在变量扩展之前支持扩展,所以你得到了   每周{} 0..4。因为结果是可预测和安全的(不要相信   用户输入),你可以在你的情况下使用eval:

     

$ WEEKS_TO_SAVE = 4
  $ eval&#34; mkdir -p每周。{0 .. $((WEEKS_TO_SAVE))}&#34;

     

请注意:

      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