Как мне добавить все файлы в current и subdirs в качестве аргументов команды?
-
11-09-2019 - |
Вопрос
У меня есть такой каталог, как этот:
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
обойдите эти ограничения.