ksh - 循环遍历目录以根据文件名的一部分删除文件

时间:2015-09-17 20:52:44

标签: ksh rm

我是一名新的ksh开发人员,其任务是根据两个条件从目录​​中删除文件。每个文件名都遵循此模式1-12345-sometext.dat

我需要的是能够删除所有.dat文件,其中第一个数字彼此相等。

例如,我目录中的文件可能是:

1-12345-sometext.dat
1-15467-sometext.dat
1-97564-sometext.dat
1-34978-sometext.dat
2-98341-sometext.dat
2-75469-sometext.dat
Somefile.csv

我需要做的是删除目录中的所有文件,其中1为前缀,.dat为扩展名。

我不知道从哪里开始,所以我没有代码可以显示。

3 个答案:

答案 0 :(得分:1)

此脚本将根据您的条件删除您的文件:

for file in `ls | grep '^\([0-9]\)-\1[0-9]\{4\}-[a-z]\+\.dat$'`
do
    rm -fv ${file}
done

基本上,它会列出所有文件,然后根据给定的条件对其进行过滤。在那里它检查符合以下条件的名称:

  • 第1位和第2位必须相等(+之间有短划线)
  • 在第二位数字之后还会有4位数字
  • 然后会有一个“破折号”和一个至少包含一个字符的小写文本

之后迭代结果集并逐个删除文件。

答案 1 :(得分:1)

感谢您的投入。它给了我去哪里的方向。我决定使用用户输入,这是我的解决方案。

#!/bin/ksh
umask 003

cycleID=$1
User=$2
SrcDir=$3

for i in ${SrcDir} -name "${cycleID}*${User}.dat";
do 
    fileArray=${i};
done

for i in ${fileArray[@]}; 
do 
    rm -f ${SrcDir}${i};
done

答案 2 :(得分:0)

你的解决方案(@staples)给出了你想要的线索: 删除以输入给定的数字开头的文件。 如果您想在脚本中使用参数,可以使用

#!/bin/ksh
if [ $# -ne 3 ]; then
   echo "Usage: $0 cycle_id pattern dir"
   exit 1
fi

cycleID=$1
pattern=$2
dir=$3

if [ ! -d "${dir}" ]; then
   echo "Your third parameter ${dir} is not a directory"
   exit 1
fi
# Exercise: You can add checks on cycleId and pattern

# show remove command
set -x
rm -f "${dir}"/${cycleId}-*-${pattern}.dat
# turn off verbose set -x
set -