Bash

循環遍歷文件夾併計算 TAR 中的文件

  • April 8, 2020

我需要遍歷文件夾併計算 TAR 中具有相同名稱的文件。

我試過這個:

find -name example.tar -exec tar -tf {} + | wc -l

但它失敗了:

tar: ./rajce/rajce/example.tar: Not found in archive
tar: Exiting with failure status due to previous errors
0

它在只有一個 example.tar 時有效。

我需要為每個文件單獨編號。

謝謝!

您需要tar -tf {} \;而不是單獨使用每個 tarballtar -tf {} +執行。tar在 GNUman find中它說:

  -exec command {} +

         This variant of the -exec action runs the specified
         command on the selected files, but the command line is
         built by appending each selected file name at the end;
         the total number of invocations of the command will be
         much less than the number of matched files.  The command
         line is built in much the same way that xargs builds its
         command lines.  Only one instance of `{}' is allowed
         within the com- mand.  The command is executed in the
         starting directory.

您的命令相當於tar tf example.tar example.tar. 您還缺少[path...]參數 - 的某些實現 find,例如 BSD find 將返回find: illegal option -- n 錯誤。總而言之應該是:

find . -name example.tar -exec tar -tf {} \; | wc -l

請注意,在這種情況下,wc -l將計算找到的所有 example.tar文件中的文件數。您可以使用僅在目前目錄中-maxdepth 1搜尋 文件。example.tar如果要example.tar遞歸搜尋所有結果並分別列印每個結果(請注意,$這是一個命令行提示符 ,用於指示新行的開始,而不是命令的一部分):

$ find . -name example.tar -exec sh -c 'tar -tf "$1" | wc -l' sh {} \;
3
3

並附加目錄名稱:

$ find . -name example.tar -exec sh -c 'printf "%s: " "$1" && tar -tf "$1" | wc -l' sh {} \;
./example.tar: 3
./other/example.tar: 3

引用自:https://unix.stackexchange.com/questions/578735