Рекурсивно подсчитывать количество файлов в папках в tar-файле

Да, просто используйте для восстановления изображения из Clonezilla :

cat sda5.ext3-ptcl-img.gz.a* | gunzip -c | partclone.restore -d -s - -o /dev/sda5

-121--45264-

Современная реализация cat (sunos-4.0 1988) использует mmap () для отображения всего файла, а затем вызывает 1x write () для этого пространства. Такая реализация не будет закольцовываться, пока виртуальная память позволяет отобразить весь файл.

Для других реализаций зависит от того, больше ли размер файла буфера ввода-вывода.

-121--26469-

Время выполнения Java учитывает переменные среды, их можно задать в системных файлах запуска.

Oracle Java использует _ JAVA _ OPTIONS , IBM Java использует IBM _ JAVA _ OPTIONS .

0
07.03.2018, 16:30
4 ответа

Si no le importa ejecutarlo dos veces (para obtener el conteo, luego las líneas ), puede usar grep.

Por la cuenta:

tar tvf myfile.tar | grep <path> | wc -l

Para las líneas, simplemente elimine| wc -l

Si prefiere ejecutar taruna sola vez, puede guardar la salida en un archivo y luego caten grep y wc. El guión en conjunto se vería así:

tmp_file=$(mktemp)
tar tvf myfile.tar > $tmp_file
cat $tmp_file | grep <subdir> | wc -l
cat $tmp_file | grep <subdir>
rm $tmp_file

Si desea una -línea, probablemente haya un truco que pueda hacer con la sustitución y redirección de procesos, pero si está ejecutando esto con alguna cadencia, probablemente terminará colocándolo en un script/alias/función de todos modos, esto es un poco más fácil de leer y entender.

Si tiene varias rutas en el archivo tar que le gustaría eliminar, puede ponerlas todas en un archivo de texto y usargrep -f <paths file>

0
28.01.2020, 02:24
tar -tvf file.tar | grep '^-' | wc -l

Esto contará el número de líneas en la salida tarque comienzan con -(, es decir, archivos ). Cambie /^-a /^[^d]/para contar "cualquier cosa menos directorios" si tiene tipos especiales de archivos en su archivo.

Otra manera, conawk:

tar -tvf file.tar | awk '/^-/ { n++ } END { print n }'

Ambos comandos generan 7, el número total de archivos en el archivo.


Si desea recuentos separados para cada subcarpeta:

tar -tvf file.tar | awk '/^d/ { d = $NF; next } { n[d]++ } END { for (d in n) print n[d], d }'

Esto genera

4./root_folder/subfolder/folder_files_2/
3./root_folder/subfolder/folder_files_1/

por los datos que has proporcionado.

El código awken este último ejemplo selecciona el nombre del directorio de cualquier línea que comience con dy lo usa como clave en una matriz asociativa. La entrada de matriz se incrementa para cada archivo encontrado. Al final, se imprimen todas las entradas y su recuento.

1
28.01.2020, 02:24

Si tiene GNU tar, tiene una opción--to-command:

--to-command=COMMAND
  Pipe extracted files to COMMAND.  The argument is the pathname
  of an external program, optionally with command line
  arguments.  The program will be invoked and the contents of
  the file being extracted supplied to it on its standard
  output.  Additional data will be supplied via the following
  environment variables:

  TAR_FILETYPE
         Type of the file. It is a single letter with the
         following meaning:

                 f           Regular file
                 d           Directory
                 l           Symbolic link
                 h           Hard link
                 b           Block device
                 c           Character device

         Currently only regular files are supported.
 ...
  TAR_FILENAME
         The name of the file.

Estas variables se pueden usar para manejar de forma segura nombres de archivos con espacios, etc.

Por ejemplo, al usar la sustitución de cadena de shell para eliminar el nombre de archivo de la ruta dada, luego al usar sed para imprimir solo las rutas de los directorios que no son -, luego puede ordenar y aplicar uniq -cpara obtener el conteo:

tar xf foo.tar --to-command 'echo "$TAR_FILETYPE" "${TAR_FILENAME%/*}"' |
  sed -n '/^[^d]/s/^. //p' | 
  sort |
  uniq -c

Si tiene GNU sed, sort y uniq,puede usar sus opciones -zy printf "%s %s\0"en lugar de echopara manejar de forma segura todos los nombres de archivo.

Ejemplo:

% tar xf dev/pacaur/byobu/byobu_5.124.orig.tar.gz --to-command 'printf "%s %s\0" "$TAR_FILETYPE" "${TAR_FILENAME%/*}"' | sed -zn '/^[^d]/s/^. //p' | sort -z | uniq -zc | tr '\0' '\n'
     15 byobu-5.124
      2 byobu-5.124/Applications/Byobu.app/Contents
      1 byobu-5.124/Applications/Byobu.app/Contents/MacOS
      8 byobu-5.124/Applications/Byobu.app/Contents/Resources
      4 byobu-5.124/etc/byobu
      3 byobu-5.124/etc/profile.d
      1 byobu-5.124/experimental
     23 byobu-5.124/po
      1 byobu-5.124/snap
     38 byobu-5.124/usr/bin
     43 byobu-5.124/usr/lib/byobu
     18 byobu-5.124/usr/lib/byobu/include
      1 byobu-5.124/usr/share/appdata
      4 byobu-5.124/usr/share/byobu/desktop
     12 byobu-5.124/usr/share/byobu/keybindings
      4 byobu-5.124/usr/share/byobu/pixmaps
      1 byobu-5.124/usr/share/byobu/pixmaps/highcontrast
     11 byobu-5.124/usr/share/byobu/profiles
      4 byobu-5.124/usr/share/byobu/status
      3 byobu-5.124/usr/share/byobu/tests
      3 byobu-5.124/usr/share/byobu/windows
      3 byobu-5.124/usr/share/dbus-1/services
      4 byobu-5.124/usr/share/doc/byobu
     37 byobu-5.124/usr/share/man/man1
      1 byobu-5.124/usr/share/sounds/byobu
1
28.01.2020, 02:24

Другой вариант:

tar tf archive.tar |
    awk '
        { if (gsub("[^/]+$", "")) { h[$0]++} }
        END { for (f in h) { printf "%d\t%s\n", h[f], f } }
    '

Первый оператор awkудаляет имена файлов и подсчитывает экземпляры результирующих путей к каталогам. Второй запускается, когда ввод полностью использован (, то есть в конце стандартного ввода ), и печатает список путей и их соответствующие счетчики.

Все это можно уместить в одну строку, если вы предпочитаете (просто буквально соединить всю партию ). Я разделил его здесь для удобства чтения.

Результат работы с вашим архивом:

4      ./root_folder/subfolder/folder_files_2/
3      ./root_folder/subfolder/folder_files_1/
1
28.01.2020, 02:24

Теги

Похожие вопросы