我想就创建文件夹和将文件移动到其中的代码寻求帮助。我想创建文件夹,放置以特定扩展名结尾的文件,每个文件夹中只放置一定数量的文件。例如,我有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':没有这样的文件或目录”。
我知道这将是一个简单的改变,但无法弄清楚。我已经完成了之前的问题,但无法对我的代码进行排序。
谢谢!
答案 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