循環遍歷資料夾並對 TAR 中的檔案進行計數

循環遍歷資料夾並對 TAR 中的檔案進行計數

我需要遍歷資料夾並對 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 時它可以工作。

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

謝謝!

答案1

您需要tar -tf {} \;而不是單獨tar -tf {} +運行tar每個 tarball。在 GNU 中man 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

答案2

我認為你的問題在於使用+操作符進行-exec操作find。該+運算符的意思是「將 的結果連接find到一個以空格分隔的列表,並以該列表作為參數執行指定的命令」。

這意味著如果不同路徑下有多個檔案example.tar(例如兩個),您的-exec命令將如下所示

tar -tf /path/1/to/example.tar /path/2/to/example.tar

等等。/path/2/to/example.tar在 TAR 檔案中/path/1/to/example.tar”,顯然不應該是這樣。

如果你將程式碼修改為

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

它將tar針對找到的每個文件單獨執行該命令。

相關內容