То, что вы хотите, возможно и легко. Просто введите
/your/java/program "$(/your/c/program)"
Нотация $(…)
называется «подстановкой команд». $(command1)
запускает command1
с выводом в канал, захватывает его и помещает в командную строку. Итак,
command2 $(command1)
работает command2
с выходом command1
в качестве аргумента строки команды -. Вы должны добавить кавычки("…"
)для обработки случая где выход из command1
(т. е. ваша программа на C )состоит из нескольких слов (, например,printf("planet earth");
). Это то, о чем вы просите.
Я подробно обсуждаю это здесь , где я показываю пример
$ ls -ld "$(date "+%B %Y").txt" -rwxr-xr-x 1 username groupname 687 Apr 2 11:09 April 2018.txt
П.С. Если вы используете очень старую или необычную систему, нотация $(…)
может не работать. В этом случае попробуйте
/your/java/program "`/your/c/program`"
`…`
— старая версия $(…)
. Если $(…)
работает в вашей системе, используйте его.
Если у вас есть GNUtar (, распространенный в Linux ), вы можете использовать опцию --transform
.
Например, с помощью вашей текущей команды мы можем увидеть каталоги:
$ find. -name '*.c' | xargs tar -rf allcfiles.tar
$ tar tf allcfiles.tar
./b.c
./d/e.c
./a.c
С помощью преобразования мы можем избежать этого:
$ find. -name '*.c' | xargs tar --transform='s!.*/!!' -rf allcfiles.tar
$ tar tf allcfiles.tar
b.c
e.c
a.c
Выражение внутри --transform
является простым выражением sed
. Этот просто удаляет все компоненты каталога.
Если ваша реализация find
поддерживает опцию -execdir
, вы можете tar
файлы без их каталогов, как это:
find. -name '*.c' -type f -execdir tar rf $PWD/mytar.tar {} +
Просто убедитесь, что путь к tar-файлу является абсолютным.
Все эти другие ответы бесполезны для UNIX в целом, поскольку они зависят от расширений конкретного поставщика. Вот метод, который работает с использованием только команд, совместимых с POSIX:
find. -name '*.c' | pax -w -s ',.*/,,' > allcfiles.tar
Если вам нравится использовать метод с использованием tar rf archive...
, вам нужно начать с правильного пустого архива в начале, так как настоящий tar
не создает архив в replace
режим. Для этого вы можете сначала запустить эту команду, чтобы создать пустой архив TAR:
printf "\000"| dd ibs=10k conv=sync > allcfiles.tar
Кстати :Я предпочитаю эту команду:
star cf allcfiles.tar -s ',*/,,' -find. -name '*.c'
, так как это самый быстрый метод, потому что star
использует libfind
, и для этого нужно вызвать stat()
только один раз для каждого файла, так как данные stat
из libfind
используются star
для настройки файла метаданные в архиве.