Перебор папок и подсчет файлов в TAR

Чисто с точки зрения nginx это похоже на работу дляtry_files. С помощью try_filesвы можете указать nginx попробовать несколько местоположений для данного URI. Что-то вроде:

location ~ ^/([^/]+)$ {
  try_files $uri /static/files/$1 =404;
}

Я не уверен в точном синтаксисе, который нужно использовать, но смысл в том, чтобы сказать nginx, чтобы сначала попробовать корневой каталог по умолчанию для файла, затем попробовать в каталоге static/filesв корне и, наконец, вернуть 404, если ничего работал.

2
08.04.2020, 16:49
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отдельно для каждого найденного файла.

1
28.04.2021, 23:18

Вам нужно tar -tf {} \;вместо tar -tf {} +для запуска tarс каждый архив отдельно. В 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
1
28.04.2021, 23:18

Теги

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