漂亮的递归目录和文件打印

Pretty recursive directory and file print

我正在构建一个 JAVA 应用程序,它将 bash 命令的输出保存到列表中。

@root ~/a $ zipinfo -1 data.zip 
a.txt
b.txt
test/
test/c.txt

root@ ~/a $ find .
.
./test
./test/c.txt
./b.txt
./data.zip
./a.txt

我们的想法是将 zip 中的文件和目录与磁盘上的内容进行比较,并从磁盘中删除任何差异。在这个例子中 test/c.txt 应该只被删除。

如您所见,格式不同。我需要哪个命令具有与 zipinfo -1 相同的样式?

我试过如下命令:

ls -R

ls -LR | grep "" 

find . -exec ls -dl \{\} \; | awk '{print }'

删除 . 前缀的一种方法是使用 sed。例如:

find . ! -name . | sed -e 's|^\./||'

! -name . 从列表中删除 . 条目。 sed 部分从每行的开头删除 ./

它应该为您提供与 zipinfo 几乎相同的格式,尽管顺序可能不同。

注意:以上建议与 Linux 和其他 unix 版本(例如 MacOS X)兼容。在 Linux 上,您可以通过以下方式获得相同的结果:

find . ! -name . -printf "%P\n"

-printf 谓词特定于 Linux findutils,%P 格式打印每个找到的文件,从开头删除搜索目录。

最简单的方法可能是向 zip 本身索要列表。它的 -sf 选项意味着显示它 添加的文件,而无需实际创建 zip 文件。所以:

$ zip add fake.zip -r -sf  *
    zip warning: name not matched: fake.zip
Would Add/Update:
  a.txt
  b.txt
  test/
  test/c.txt
Total 4 entries (0 bytes)

您 Java 代码将不得不跳过它也输出的无关 header/footer 行,但文件列表本身的格式与您从其他执行中获得的格式相同共 zip.