Я хочу работать со всеми файлами в имеющемся у меня каталоге, которые находятся в каком-то каталоге (например, .../bin/.../myfile.txt
), где каждый ...
может иметь любое количество каталогов в глубину. В оболочке nu я могу сделать это напрямую, используя **
(рекурсивный подстановочный знак), например: делает:
mycommand **/bin/**/myfile.txt
Я попробовал использовать Get-ChildItem
следующим образом:
Get-ChildItem -Path . -Recurse -Filter myfile.txt
Но при этом будут получены все экземпляры myfile.txt
, а не только те, которые вложены в каталог bin/
. Также кажется, что **
в PowerShell нет, так что это не вариант. Есть ли какой-нибудь простой способ получить то, что я хочу?
Аналогично, как можно сделать то же самое в bash (опять же, похоже, **
мне недоступно)?
вы можете отфильтровать его в операторе where
. что-то вроде Get-ChildItem -Path . -Recurse -Filter myfile.txt | Where{$_.FullName -like "$PWD*\bin\*myfile.txt"}
Который будет фильтровать пути, начинающиеся с $PWD
(рабочий каталог PowerShell), иметь папку с именем bin
где-то в пути и заканчиваться соответствующим файлом. Да, нет необходимости помещать файл дважды, но так будет быстрее.
Это немного неуклюже, но в PowerShell можно сделать следующее:
Get-ChildItem -Path . -Recurse -Directory -Filter bin | Get-ChildItem -Recurse -File -Filter myfile.txt
Первая команда находит все каталоги bin/
, а затем вторая просматривает эти каталоги и рекурсивно ищет нужный файл. Вы можете связать это вместе для любого количества каталогов между ними.
Если вы собираетесь это сделать, используйте параметр -directory
в первом Get-ChildItem
, чтобы поставщик файловой системы не возвращал никаких файлов. Вы могли бы добавить -file
ко второму, но это позволит избежать возврата папки с именем myfile.txt
, что кажется маловероятным, если только вы не ищете файлы без расширения.
Хорошее предложение! Отредактирую это.
Аналогично, используя find
, вы можете сделать
find . -type d -name bin -exec find {} -name myfile.txt \;
чтобы вывести список всех файлов с именем myfile.txt
внутри любого подкаталога bin
.
В bash вам нужно включить
**
с помощьюshopt -s globstar
.