一个非常基本的问题,但我似乎无法在stackoverflow或其他网上找到解决问题的答案。
我正在编写一个简单的bash脚本来批量处理一堆文件。该脚本由目录列表提供,然后单独处理它们。不幸的是,每个文件名的格式可能会有所不同,这就是我遇到麻烦的地方。下面是我正在使用的文件名类型和我正在使用的脚本的示例。
P.S。我确信也许有一些方法可以使用awk(或任何数量的unix工具,但现在我专注于sed)。
提前致谢:
文件:
/home/acct/Foo-Bar.fl
/home/acct/Foo-1.1.fl
/home/acct/Cat-3.4-500.fl
/home/acct/DOG-BEAR-4.4-1.1.fl
/home/acct/DOG-BEAR-4.4-UPDATED.fl
我正在尝试从这些行中提取完整路径,文件名,版本号和文件前缀。以下是我最近的尝试:
DIR_PATH="/home/acct/
for i in `find ${DIR_PATH}`;
do
FILEPATH="$i"
FILENAME=`echo $i | sed -e "s#${DIR_PATH}##g"`
FILEPREFIX=`echo $FILENAME | sed -e "s/\(.*\)-[0-9]\+.*/\1/g"`
FILEVERSION=`echo $FILENAME | sed -e "s/.*-\([0-9]\+.*\)\.fl/\1/g`
echo "$DIR_PATH"
echo "$FILE_PATH"
echo "$FILENAME"
echo "$FILEPREFIX"
echo "$FILEVERSION"
#do something with this file now that I know what is going on with it
done
在处理由“破折号”分隔的版本号和没有版本号的文件时,麻烦发挥作用。我想我已经解决了复杂版本号的所有问题,但我仍在努力应对根本不存在版本号的情况。
我想我需要做某种或者表达式(或者有第二个sed语句来做另一次传递),但我不确定如何格式化它。
更新
根据Axel的评论,使用 basename 而不是尝试匹配路径,可以更轻松地确定文件名。此外,下面的答案涉及从扩展名中拆分文件名,这也是我认为值得合并的更改。
我会更新脚本,但更改类似于:
FILEPATH="$i"
FILENAME=`basename $i`
FILENAMENOSUFFIX=`echo $FILENAME | sed -e "s/\(.*\)\..*/\1/g"`
FILEPREFIX=`echo $FILENAME | sed -e "s/\(.*\)-[0-9]\+.*/\1/g"`
答案 0 :(得分:1)
Pure Bash(find
除外):
shopt -s extglob
while read -r file
do
dir=${file%/*}
name=${file##*/}
noext=${name/%.fl}
pre=${noext%%-@([0-9])*}
ver=${noext/#$pre-}
[[ ${#ver} == ${#noext} ]] && ver=
echo "Dir: $dir, Name: $name, Noext: $noext"
echo " Pre: $pre, Ver: $ver"
done < <(find "$dir" -type f)
使用示例文件名输出:
Dir: /home/acct, Name: Foo-Bar.fl, Noext: Foo-Bar
Pre: Foo-Bar, Ver:
Dir: /home/acct, Name: Foo-1.1.fl, Noext: Foo-1.1
Pre: Foo, Ver: 1.1
Dir: /home/acct, Name: Cat-3.4-500.fl, Noext: Cat-3.4-500
Pre: Cat, Ver: 3.4-500
Dir: /home/acct, Name: DOG-BEAR-4.4-1.1.fl, Noext: DOG-BEAR-4.4-1.1
Pre: DOG-BEAR, Ver: 4.4-1.1
Dir: /home/acct, Name: DOG-BEAR-4.4-UPDATED.fl, Noext: DOG-BEAR-4.4-UPDATED
Pre: DOG-BEAR, Ver: 4.4-UPDATED
答案 1 :(得分:0)
find . -type file | sed 's!\(.*\)/\([^/0-9]*\)-\([0-9][^/]*\)\.\([^./]*\)$!\0 \1 \2 \3 \4!'
这假定每个文件的设置如下:{base} / {prefix} - {version-starts-with-number}。{extension}