Как вернуть абсолютный путь рекурсивно согласованных аргументов?(BASH) - PullRequest
1 голос
/ 05 января 2012

ОК, все достаточно просто. Я хочу рекурсивно искать в каталоге файлы с определенным расширением, а затем выполнять действия с этими файлами.

# pwd ENTER
/dir

# ls -R | grep .txt | xargs -I {} open {} ENTER
The file /dir/reallyinsubfolder.txt does not exist. ⬅ не работает (плохо)
Не выводится, но успешно .. /dir/fileinthisfolder.txt ⬅ открывается тихо (хорошо)

Этот действительно находит ВСЕ файлы, которые меня интересуют ... но только ОТКРЫТЫЕ те, которые оказываются "1-уровневыми". В этом случае попытка открыть /dir/reallyinsubfolder.txt не удалась, так как reallyinsubfolder.txt на самом деле /dir/sub/reallyinsubfolder.txt.

Я понимаю, что grep просто возвращает совпавшее имя файла ... которое затем душит (в данном случае) команду open, так как не удается добраться до нужного подкаталога для выполнения файла ..

Как мне получить grep, чтобы вернуть полный путь матча?

Ответы [ 3 ]

2 голосов
/ 05 января 2012

Как насчет использования команды find -

find /path/to/dir -type f -iname "*.txt" -exec action to perform {} \;
1 голос
/ 05 января 2012

Я полагаю, вы задаете не тот вопрос; синтаксический анализ ls(1) вывода таким способом - гораздо больше проблем, чем стоит .

Что будет работать гораздо надежнее:

find /dir -name '*.txt' -print0 | xargs -0 open

или

find /dir -name '*.txt' -exec open {} \;

find(1) не искажает имена почти так же, как ls(1), и делает выполнение программ для сопоставленных файлов намного более надежным.

1 голос
/ 05 января 2012
find . -name *.txt -exec open {};

(Украсить обратными слешами по необходимости)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...