我需要遍歷資料夾並對 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
針對找到的每個文件單獨執行該命令。