0

我正在尝试为我的包创建规范文件。要列出我正在使用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's

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选项,但它仍然在替换 all /bin。有什么办法可以加入"\n"sed

4

2 回答 2

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 即时创建),它将阻止您损坏原始文件。

于 2013-02-18T09:58:52.370 回答
0

使用您当前的技术,确保模式与整行匹配$以标记行尾:

sed -i "s@^$file_name\$@%dir $file_name@" $TOPDIR/list_files

需要反斜杠以防止外壳扩展$@sed看不到反斜杠。

于 2013-02-18T05:21:22.717 回答