як "знайти" не повертати поточний каталог


11

Наразі я намагаюся find(і скопіювати) всі файли та структуру папок, що відповідають певному шаблону, у визначеному каталозі, і я майже там!

Зокрема, я хочу рекурсивно копіювати всі папки, які не починаються символом '_', із вказаного шляху.

find /source/path/with/directories -maxdepth 1 -type d ! -name _\* -exec cp -R {} /destination/path \;

У / source / path / with / каталогах / path є конкретні каталоги, що починаються з '_' та інші, і мені цікаво лише копіювати інші. З іншого боку, команда find повертає / source / path / with / directories / каталог, а тому копіює його вміст, включаючи каталоги, що починаються з '_'.

У когось є натяк на те, чому це так?

Дякую,

Паскаль


Відповіді:


14

findповертає кореневий шлях, оскільки він відповідає вашим критеріям - тобто це каталог, і він не починається з _.

Ви шукаєте -mindepth 1, я підозрюю:

$ cd /tmp
$ mkdir a
$ touch a/b
$ mkdir a/c
$ touch a/c/d
$ find a
a
a/b
a/c
a/c/d
$ find a -mindepth 1
a/b
a/c
a/c/d

Довідка: знайти manpage


Відмінно! працює так, як я хотів. У мене це працювало, додаючи! -name 'файли', але мені стало погано ...
Pinpin

0

Змінити з:

find /source/path/with/directories ...

до:

(shopt -s dotglob; find /source/path/with/directories/* ... )

Цей шлях /source/path/with/directoriesне буде включений.

Це shopt -s dotglobтак, що *також будуть відповідати файли та каталоги, починаючи з .(приховані файли, каталоги).

І вся справа загорнута в підкольову оболонку, (...)щоб обмежити ефект shoptлише всередині підкошти, інакше вам доведеться скасувати її згодом shopt -u dotglob.


Це не вдасться для записів каталогів, які починаються з .. Не намагайтеся .*, інакше, інакше ви будете відповідати цілій лоті з іншими речами, яких ви ніколи не збиралися. ;-)
zigg

Хороший момент, оновив відповідь, додав, використовуючи shopt.
janos
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.