在Linux中的文件旁边添加注释

时间:2014-06-05 16:02:18

标签: linux bash file comments

我只想在Linux(Ubuntu)中的文件旁边添加注释。一个例子是:

info user ... my_data.csv           Raw data which was sent to me.
info user ... my_data_cleaned.csv   Raw data with duplicates filtered.
info user ... my_data_top10.csv     Cleaned data with only top 10 values selected for each ID.

所以你可以在Git中评论提交的方式。我并不特别关心搜索这些标签,过滤它们等等。当我在目录中列出文件时,只看到它们。如果评论/标签在复制或移动时跟随文档,则可以获得奖励。

2 个答案:

答案 0 :(得分:1)

大多数文件系统类型都支持可以存储注释的扩展属性。

例如要对“foo.file”创建评论:

xattr -w user.comment "This is a comment" foo.file

属性可以随文件一起复制/移动,但请注意,许多实用程序需要特殊选项来复制扩展属性。

然后使用获取扩展属性的脚本或程序列出带有注释的文件。这里有一个简单的例子作为起点,它只是列出当前目录中的文件:

#!/bin/sh
ls -1 | while read -r FILE; do
   comment=`xattr -p user.comment "$FILE" 2>/dev/null`
   if [ -n "$comment" ]; then
      echo "$FILE Comment: $comment"
   else
      echo "$FILE"
   fi
done

xattr 命令真的很慢而且写得很糟糕(它甚至不返回错误状态)所以如果可能的话我建议其他的东西。在比我提供的更复杂的脚本中使用 setfattrgetfattr。或者可能是一个知道 user.comment 属性的自定义 ls 命令。

答案 1 :(得分:0)

这是一个中等严重的挑战。基本上,您希望向文件添加属性,在复制或移动文件时保留属性,然后修改ls以显示这些属性的值。

所以,这就是我如何解决这个问题。

1)将信息存储在sqlLite数据库中。你可以用一张桌子逃脱。该表应包含文件的完整路径和注释。我将数据库命名为〜/ .dirinfo / dirinfo.db。我将它存储在子文件夹中,因为稍后您可能会发现此文件夹中需要其他信息。使用inode而不是路径名很好,但是它们变化太频繁了。尽管如此,您仍然可以执行存储inode和路径名的操作,并且仅当通过inode检索失败时才按路径名检索,在这种情况下,您将更新inode信息。

2)编写一个bash脚本来创建/读取/更新/删除给定文件的注释。

3)编写另一个与ls一起使用的bash函数或脚本。我不打电话给它" ls"但是,因为你不想搞乱ls可用的所有命令行选项。您将在脚本中始终将{ls}称为ls -1,可能还有一些排序选项,例如-t和/或-r。无论如何,您的脚本将调用ls -1并循环输出,显示文件名和注释,您将使用2)中的脚本查找。您可能还想添加文件大小,但这取决于您。

4)编写函数来替换mv和cp(和ln ??)。这些将是更新表中信息的包装函数,然后调用这些命令的常规Unix版本,传递函数接收的任何参数(即" $ @")。如果您真的很偏执,那么您也可以使用scp这样的东西,可以使用(低效率)在本地复制文件。尽管如此,你不太可能抓住所有可能性。如果其他人在您的文件上创建了一个mv,并且没有您拥有的功能,该怎么办?如果某些脚本通过调用/ bin / mv移动文件会怎么样?你不能轻易解决这些问题。

或者,如果你真的想要冒险,你可以编写一些C / C ++代码来做到这一点。如果你理解fork()和exec(),它会更快,老实说也不是那么具有挑战性。我不记得sqlite是否有C API。我认为确实如此。你也必须纠结于此,但由于你只有一个数据库和一个表,这不应该太具挑战性。

你也可以在perl中完成它,但是我不确定在perl中比在bash中更容易。你的实际代码并不复杂,你不可能做任何疯狂的正则表达式或字符串操作。只有很多小块可以组合在一起。

所有这一切都比在这里回答问题的人所预期的要多得多,但我已经给了你整体设计。如果你遵循上面的设计并且可以忍受约束,那么实现它应该相对容易。