Я хочу работать со всеми файлами в имеющемся у меня каталоге, которые находятся в каком-то каталоге (например, .../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.