Как я могу форсировать только относительные пути в выводе "find"?

16506
Shane

Я пытаюсь создать скрипт, который может сжимать файлы с определенным расширением в нескольких каталогах в один tar-шар. В настоящее время у меня есть в файле сценария:

find "$rootDir" -name '*doc' -exec tar rvf docs.tar {} \; 

Где $rootDirнаходится базовый путь для поиска.

Это нормально, за исключением того, что пути в файле tar являются абсолютными. Я бы предпочел, чтобы пути были относительно $rootDir. Как бы я поступил так?

Пример тока, tar -tf docs.tarгде $rootDirнаходится /home/username/testвыход:

home/username/test/subdir/test.doc home/username/test/second.doc 

Что я хочу, чтобы результат был:

./subdir/test.doc ./second.doc 
17

2 ответа на вопрос

11
David Spillett

Если вы запускаете findиз нужного корневого каталога и не указываете абсолютную начальную точку в findпараметрах, он выведет относительные пути к tarвызовам команд, которые он создает. Вот так:

cd $rootDir find . -name '*doc' -exec tar rvf docs.tar {} \; 

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

pushd $rootDir find . -name '*doc' -exec tar rvf docs.tar {} \; popd 

вместо.

Обратите внимание, что pushd / popd присутствуют не во всех оболочках, поэтому проверьте соответствующую страницу руководства. Они присутствуют в bash, но не в базовой реализации sh, поэтому при явном использовании /bin/bashвы можете на них положиться, но не можете, если об этом попросит скрипт /bin/sh(так как это может отображаться в меньшую оболочку, не имеющую улучшений bash)

Благодарю. Работал блестяще. Не понял, что в Linux есть pushd / popd. Shane 14 лет назад 0
Или просто используйте `cd $ rootDir` и` cd -` (по крайней мере, в `bash`). `(cd $ rootDir; find ...)` также возможно, т. е. все делается в подоболочке. Daniel Beck 11 лет назад 2
0
Gabriel

Вы можете использовать %Pформат в -printfдирективе:

find $ -name '*.doc' -printf "%P\n" 

будет отображаться в вашем примере:

subdir/test.doc second.doc 

Затем вы можете использовать этот findсписок в forвыражении для запуска нашей команды exec, например:

for f in $( find $ -name '*.doc' -printf "%P\n" ); do tar rvf docs.tar $ done 

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