Как заархивировать все файлы без путей

То, что вы хотите, возможно и легко. Просто введите

/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`"

`…`— старая версия $(…). Если $(…)работает в вашей системе, используйте его.

0
23.01.2020, 22:09
3 ответа

Если у вас есть 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. Этот просто удаляет все компоненты каталога.

3
28.01.2020, 02:14

Если ваша реализация findподдерживает опцию -execdir, вы можете tarфайлы без их каталогов, как это:

find. -name '*.c' -type f -execdir tar rf $PWD/mytar.tar {} +

Просто убедитесь, что путь к tar-файлу является абсолютным.

3
28.01.2020, 02:14

Все эти другие ответы бесполезны для 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для настройки файла метаданные в архиве.

0
28.01.2020, 02:14

Теги

Похожие вопросы