Як я можу форсувати лише відносні шляхи у виході "знайти"?


25

Я намагаюся створити скрипт, який може стискати файли з певним розширенням у ряді каталогів в єдину тар-кульку. На даний момент у файлі сценарію є:

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

Відповіді:


12

Якщо ви запустите findз потрібного кореневого каталогу і не вкажете абсолютну початкову точку в findпараметрах s, він виведе відносні шляхи до 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, але не в реалізації base sh, тому при явному використанні /bin/bashви можете покластися на них, ви не можете, якщо сценарій вимагає /bin/shзамість цього (оскільки це може відображатись на меншу оболонку, яка не має вдосконалення bash)


Спасибі. Працював блискуче. Не усвідомлював, що Linux мав pushd / popd.
Шейн

3
Або просто використовувати cd $rootDirі cd - (принаймні в bash). ( cd $rootDir ; find ... )також було б можливо, тобто робити все в передпласті.
Даніель Бек

9

Ви можете використовувати %Pформат у -printfдирективі:

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

відобразиться у вашому прикладі:

subdir/test.doc
second.doc

Потім ви можете використовувати цей findсписок у forвиразі, щоб виконати нашу команду exec, як у:

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

1
Прийняте рішення працює, але в основному є хаком. ІМХО, це має бути правильним рішенням питання.
Narcolessico

Дякую Нарколесіко. Це також MHO :-)
Габріель
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.