Чисто с точки зрения nginx это похоже на работу дляtry_files
. С помощью try_files
вы можете указать nginx попробовать несколько местоположений для данного URI. Что-то вроде:
location ~ ^/([^/]+)$ {
try_files $uri /static/files/$1 =404;
}
Я не уверен в точном синтаксисе, который нужно использовать, но смысл в том, чтобы сказать nginx, чтобы сначала попробовать корневой каталог по умолчанию для файла, затем попробовать в каталоге static/files
в корне и, наконец, вернуть 404, если ничего работал.
Я думаю, что ваша проблема заключается в использовании оператора +
для операции -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
отдельно для каждого найденного файла.
Вам нужно 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