我正在尝试为我的包创建spec文件。
要列出我正在使用find
命令并将其重定向到文件的文件:
readonly TOPDIR=`pwd`
cd package_folder
find . -iname >>$TOPDIR/list_files
现在我的问题是我需要为每个目录添加前缀%dir
,否则我会将文件列出两次错误。
假设我的文件内容是:
$ cat list_files
/bin
/bin/file_a
/bin/my_folder
/bin/my_folder/file_b
我所做的是寻找dir的
for file_name in `cat $TOPDIR/list_files`
do
chk_1=`ls -l $file_name |grep "^d"`
if [ "chk_1" ] ;then
sed -i "s@^$file_name@%dir $file_name@" $TOPDIR/list_files
fi
done
现在我的输出文件(list_files)如下所示:
%dir /bin
%dir /bin/file_a
%dir /bin/my_folder
%dir /bin/my_folder/file_b
原因/bin
是一个目录,因此它将/bin
替换为%dir
。
嗯,这有点奇怪,因为我没有给出@g
选项,但它仍在替换所有/bin
。
有没有办法在"\n"
中加入sed
?
答案 0 :(得分:1)
你的脚本很容易出错。请改用:
while IFS= read -r file_name
do
[ -d "$file_name" ] && pfx="%dir " || pfx=""
printf "%s%s\n" "$pfx" "$file_name"
done < "$TOPDIR/list_files" > tmp &&
mv tmp "$TOPDIR/list_files"
它将保护您免受包含空格,制表符,@符号,反斜杠等等的文件名的影响,并且如果tmp文件的空间不足(在sed上创建sed文件),它将阻止您破坏原始文件飞)。
答案 1 :(得分:0)
使用您当前的技巧,确保模式与$
的整行匹配,以标记该行的结尾:
sed -i "s@^$file_name\$@%dir $file_name@" $TOPDIR/list_files
需要使用反斜杠来防止shell展开$@
; sed
没有看到反斜杠。