копировать рекурсивно пропуская каталоги с определенным именем

Вот еще несколько способов сделать это:

  1. Perl

    echo "lib/oracle-11.2.0.3.0.txt" | perl -pe 's/.+(oracle.+)\.txt/$1/'
    
  2. sed

    echo "lib/oracle-11.2.0.3.0.txt" | sed 's/.*\(oracle.*\)\.txt/\1/'
    
  3. cut

    echo "lib/oracle-11.2.0.3.0.txt" | cut -d'/' -f 2 | cut -d '.' -f 1-5
    
  4. basename и bash

    echo "lib/oracle-11.2.0.3.0.txt" | while read n; do 
      echo $(basename ${n/.txt//}); 
    done
    
5
24.08.2017, 03:32
2 ответа

вы можете использовать find для этого

find -depth ! -wholename '*foo*' ! -wholename '*bar*' -exec cp --parents '{}' /target/dir/ \;

обратите внимание, что вам а) понадобится -depth , чтобы сделать убедитесь, что вы сначала найдете каталоги, которые необходимо опустить, и б) используйте параметр - parent для cp , чтобы создать полный путь при копировании.

Это, однако, также пропустит пустые папки, так как -r в cp не может использоваться, так как тогда ВСЕ файлы будут скопированы, как только find перейдет в ./firstDIR.

1
27.01.2020, 20:36

Вы хотите rsync :

rsync -va --exclude=foo --exclude=bar ~/directory_to_copy /path/to/copy 

- exclude используется для исключения нежелательных файлов или каталогов.

-v делает rsync подробным (необязательно).

-a указывает rsync рекурсивно копировать и сохранять атрибуты файлов. Это необязательно, но если вы не используете -a , вы, вероятно, захотите использовать -r для рекурсивного копирования.

Для более сложных требований могут быть указаны параметры исключения и включения. Можно даже изменить настройки исключения / включения из одного каталога в другой, указав параметр -F и поместив файлы .rsync-filter в различные места в иерархии исходных каталогов. man rsync содержит подробности.

7
27.01.2020, 20:36

Теги

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