Вот еще несколько способов сделать это:
Perl
echo "lib/oracle-11.2.0.3.0.txt" | perl -pe 's/.+(oracle.+)\.txt/$1/'
sed
echo "lib/oracle-11.2.0.3.0.txt" | sed 's/.*\(oracle.*\)\.txt/\1/'
cut
echo "lib/oracle-11.2.0.3.0.txt" | cut -d'/' -f 2 | cut -d '.' -f 1-5
basename
и bash
echo "lib/oracle-11.2.0.3.0.txt" | while read n; do
echo $(basename ${n/.txt//});
done
вы можете использовать find
для этого
find -depth ! -wholename '*foo*' ! -wholename '*bar*' -exec cp --parents '{}' /target/dir/ \;
обратите внимание, что вам а) понадобится -depth
, чтобы сделать убедитесь, что вы сначала найдете каталоги, которые необходимо опустить, и б) используйте параметр - parent
для cp
, чтобы создать полный путь при копировании.
Это, однако, также пропустит пустые папки, так как -r
в cp
не может использоваться, так как тогда ВСЕ файлы будут скопированы, как только find перейдет в ./firstDIR.
Вы хотите 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
содержит подробности.