Как мне добавить все файлы в current и subdirs в качестве аргументов команды?

StackOverflow https://stackoverflow.com/questions/1836490

Вопрос

У меня есть такой каталог, как этот:

dir
dir/somefile.txt
dir/subdir/subsub/somefile2.txt
dir/subdir2/somefile.txt

и я хочу открыть все файлы во всех подкаталогах в одном экземпляре команды.Я пытался найти с помощью -exec или xargs, но они открывают каждый файл отдельным экземпляром команды.

По сути, я хочу что-то, что в конечном итоге будет выглядеть так kate dir/somefile.txt dir/subdir/subsub/somefile2.txt dir/subdir2/somefile.txt, но для любого количества файлов в любом количестве подкаталогов.Я использую bash, но любые предложения по сценарию подойдут.

разъяснение:Я имел в виду не только файлы .txt, но и любой файл ascii (т.е..php, .txt, .html и т.д.)

Это было полезно?

Решение

Попробуй

kate `find . -name \*.txt -type f`

где находится -type f предотвращает попадание в каталоги.

Вот пример использования ls -1 вместо того, чтобы kate:

edd@ron:~/src/debian/R$ ls -1 `find . -type f -name \*.txt`
./R-2.10.0/src/extra/graphapp/readme.txt
./R-2.10.0/src/extra/xdr/copyrght.txt
./R-2.10.0/src/extra/xdr/README.txt
./R-2.10.0/src/gnuwin32/fixed/etc/rgb.txt
./R-2.10.0/src/gnuwin32/installer/CustomMsg.txt
./R-2.10.0/src/library/grid/inst/doc/changes.txt
./R-2.10.0/src/unix/system.txt
./R-2.9.2-ra-1.2.8/src/extra/graphapp/readme.txt
./R-2.9.2-ra-1.2.8/src/extra/xdr/copyrght.txt
./R-2.9.2-ra-1.2.8/src/extra/xdr/README.txt
./R-2.9.2-ra-1.2.8/src/gnuwin32/fixed/etc/rgb.txt
./R-2.9.2-ra-1.2.8/src/gnuwin32/installer/CustomMsg.txt
./R-2.9.2-ra-1.2.8/src/library/grid/inst/doc/changes.txt
./R-2.9.2-ra-1.2.8/src/unix/system.txt
edd@ron:~/src/debian/R$

и если вам действительно нужны все файлы в подкаталогах, вызов упрощается до

kate `find . -type f`

если вы находитесь в dir/ или же

kate `find dir -type f`

Другие советы

Для этого есть несколько возможных вариантов.Эти ответы основаны на вашем сценарии, когда вы знаете, что все файлы могут быть открыты kate, и вы хотите открывать файлы с любым расширением.

find dir -type f -exec kate {} +  

kate $(find dir -type f)

kate `find dir -type f`

Вторая и третья формы почти эквивалентны.Основное отличие [1] заключается в том, что первая версия будет обрабатывать файлы с пробелами в их названиях, в то время как вторая и третья этого не делают.

[1] Спасибо, что указали на это NVRAM, я не осознавал, когда впервые опубликовал ответ.

kate $(find dir -type f)

Вы либо не очень хорошо знакомы с xargs, или вы используете его неправильно, потому что то, что вы пытаетесь сделать, это именно в этом и проблема xargs предназначен для решения:Учитывая сколь угодно длинный список строк, передавайте их в качестве аргументов программе за как можно меньшее количество выполнений, не превышая при этом системных ограничений на количество аргументов, которые может принимать программа.

Ты подходишь для find ... -exec, но это также можно исправить.Просто добавьте + в конце find команда и вуаля, он ведет себя как xargs.

Ни одно из приведенных выше решений, которые используют kate $(...) (или эквивалент с обратными метками) работают в целом (они не поддерживают имена файлов с пробелами, вообще не будут запускаться, если список файлов очень длинный).И то , и другое find ... + и xargs обойдите эти ограничения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top