我有以下文件:File_1.2.txt
,File_1.5.txt
,File_2.3.txt
和File_4.7.txt
。
我想为它们创建目录并将它们排序到目录中,如下所示。
Dir_001 -> File_1.2.txt File_1.5.txt
Dir_002 -> File_1.2.txt File_2.3.txt
Dir_003 -> File_2.3.txt
Dir_004 -> File_4.7.txt
Dir_005 -> File_1.5.txt
Dir_007 -> File_4.7.txt
因此,为文件使用的每个数字创建一个目录,并将包含目录匹配编号的所有文件分类到其中。
答案 0 :(得分:2)
#!/bin/bash
# If there are no files match File_*.*.txt
# replace File_*.*.txt by empty string
shopt -s nullglob
for i in File_*.*.txt; do
echo "processing file $i"
IFS="_." read foo num1 num2 foo <<< "$i"
printf -v dir1 "Dir_%03d" "$num1"
printf -v dir2 "Dir_%03d" "$num2"
mkdir -pv "$dir1" "$dir2"
cp -v "$i" "$dir1"
cp -v "$i" "$dir2"
done
答案 1 :(得分:1)
你至少应该亲自试过这个。仅仅复制其他人的代码并不是一种好的学习方式。
有几种方法可以做到这一点,这是我的,你的在哪里?
#!/bin/bash
function make_dir
{
#name="Dir00$1"
# Cribbed from the answer given by @Cyrus
printf -v name "Dir_%03d" "$1"
echo "$name"
if [[ ! -d $name ]]
then
mkdir "$name"
fi
}
# I don't need an array here, but I have no idea where these filenames come from
filenames=(File_1.2.txt File_1.5.txt File_2.3.txt File_4.7.txt)
for fname in ${filenames[@]}
do
for seq in {1..999} # No idea what the upper limit should be
do
#if [[ $fname == *$seq* ]]
# Edit: to handle multi-character sequences
if [[ $fname == *[_.]$seq.* ]]
then
dir=$(make_dir $seq)
cp "$fname" "$dir"
fi
done
done
其他人无疑会改善这一点。
编辑功能和序列。