bash中的文件处理和目录匹配
我有这些文件:文件1.2.txt、文件1.5.txt、文件2.3.txt和文件4.7.txt 我想为它们创建目录,并将它们排序到目录中,如下所示bash中的文件处理和目录匹配,bash,shell,sorting,matching,file-handling,Bash,Shell,Sorting,Matching,File Handling,我有这些文件:文件1.2.txt、文件1.5.txt、文件2.3.txt和文件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
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
因此,将为文件使用的每个编号创建一个目录,并将包含该目录匹配编号的所有文件排序到该目录中 你至少应该自己尝试一下。仅仅复制别人的代码并不是一种好的学习方式 有几种方法,这是我的,你的呢
#!/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
其他人无疑会在这方面有所改进
编辑函数和序列。这太棒了!我不知道从哪里开始,在过去的几个小时里我一直在尝试一些东西,但是没有成功。我唯一的问题是,如何在name=Dir00$1处使用printf或sprintf这样的东西,所以当我有10个或更多目录时,它是Dir010而不是Dir0010。@ChemistnotaProgrammer:看看Cyrus给出的答案,这应该会给你一个线索。我对使用他的方法犹豫不决,因为那是剽窃。您应该增加{1..7}中的顺序-您的问题中没有提到大于7的数字,@ChemistnotaProgrammer:将name=Dir00$1替换为printf-v name Dir_%0.3d$1。@cdarke:这是一个错误。这个圆点没用。“谢谢你!”程序员:你猜怎么着?现在你是一名程序员。来吧,加入我们,不要害怕,成为我们中的一员我们中的一员,我们中的一员,我们中的一员……你能给我简单描述一下IFS=\ux这一行吗。读foo num1 num2 foo这行使用uu和。作为字段分隔符并将字符串(例如文件_1.2.txt)从$i拆分为四部分。无用文件到$foo、1到$num1、2到$num2和无用的txt将再次覆盖$foo以避免出现新变量。
#!/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