0

パッケージの仕様ファイルを作成しようとしています。ファイルを一覧表示するには、findコマンドを使用してファイルにリダイレクトします。

readonly TOPDIR=`pwd` 
cd package_folder
find . -iname >>$TOPDIR/list_files

今私の問題は%dir、すべてのディレクトリにプレフィックスを追加する必要があることです。そうしないと、ファイルが2回リストされるというエラーが発生します。私のファイルの内容は次のとおりです。

$ cat list_files
/bin
/bin/file_a
/bin/my_folder
/bin/my_folder/file_b

私がしたことは、ディレクトリを探しました

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?

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 に答える