Как добавить все файлы в текущий и подкаталоги в качестве аргументов команды? - PullRequest
1 голос
/ 03 декабря 2009

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

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 и т. Д.)

Ответы [ 4 ]

3 голосов
/ 03 декабря 2009

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

find dir -type f -exec kate {} +  

kate $(find dir -type f)

kate `find dir -type f`

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

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

3 голосов
/ 03 декабря 2009

Попробуйте

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`
2 голосов
/ 03 декабря 2009

kate $(find dir -type f)

0 голосов
/ 03 декабря 2009

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

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

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

...