Как скопировать иерархию каталогов (исключая файлы) в другой каталог?

$ sed '/abstract =.*},$/d; /abstract = /,/},$/d' <file
@article{ginsberg_lifespan_2018,
    title = {On the lifespan of three-dimensional abstract gravity water waves with vorticity},
    language = {en},
    urldate = {2018-12-05},
    author = {Ginsberg, Daniel},
    month = dec,
    year = {2018}
}

@article{higaki_two-dimensional_2017,
    title = {On the two-dimensional steady {Navier}-{Stokes} equations related to flows around a rotating obstacle},
    journal = {arXiv:1703.07372 [math]},
    author = {Higaki, Mitsuo and Maekawa, Yasunori and Nakahara, Yuu},
    month = mar,
    year = {2017},
    note = {arXiv: 1703.07372},
    keywords = {Mathematics - Analysis of PDEs}
}

Это сначала пытается удалить запись из одной строки abstract, а если это не работает, пытается удалить запись из нескольких строк -abstract. Многострочная запись -— это набор строк от строки, содержащей abstract =, до следующей строки, заканчивающейся на },.

Аннотированный sedсценарий:

/abstract =.*},$/d    # delete complete abstract line, skip to next input line
/abstract = /,/},$/d   # delete multi-line abstract entry

Если вам нужно уточнить начальную строку, вы можете использовать, например, ^[[:blank:]]*abstractвместо бита abstractв этих выражениях. Это позволит использовать только пробелы или символы табуляции перед abstract =в этих строках.

0
16.03.2020, 14:42
2 ответа

Используя rsync и фильтрацию (-f )вы можете фильтровать каталоги и отфильтровывать все остальное, вот так:

rsync -av -f "+ */" -f "- *" src_dir/ new_dir/
1
28.04.2021, 23:20

Вы можете изменить ;на +для find... -exec, уменьшив количество вызовов процесса. В этой ситуации вам нужно использовать небольшую часть оболочки, чтобы развернуть список каталогов, которые будут переданы в:

find src_dir -type d -exec bash -c 'echo cd "$0" && echo mkdir -p "$@"' dest_dir {} +

Удалите два экземпляра echo, если вы уверены, что все работает должным образом. (Обратите внимание, что вы получите dest_dir/src_dir/...; если вы этого не хотите, используйте этот тип конструкции, не забывая убедиться, что dest_dirпереписан как абсолютный путь):

cd src_dir && find -type d...
1
28.04.2021, 23:20

Теги

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