Команда может непосредственно записать в /dev/tty
предотвращение регулярного перенаправления для случая.
$ cat demo
#!/bin/ksh
LC_ALL=C TZ=Z date > /dev/tty
$ ./demo >demo.out 2>demo.err
Fri Dec 28 10:31:57 2012
$ ls -l demo*
-rwxr-xr-x 1 jlliagre jlliagre 41 2012-12-28 11:31 demo
-rw-r--r-- 1 jlliagre jlliagre 0 2012-12-28 11:31 demo.err
-rw-r--r-- 1 jlliagre jlliagre 0 2012-12-28 11:31 demo.out
Если дерево каталогов является больше, чем просто ..../f03
можно использовать это rsync
управляйте для копирования каждого fo1
& fo2
и исключите любой каталог с именем fo*
.
$ rsync -avz --include='fo[12]/' --exclude='fo*/' \
Main_Dir/ new_Main_Dir/.
При контакте с этими типами сценариев копии я всегда использую rsync
и это --dry-run
& --verbose
переключатели, таким образом, я вижу то, что это собирается обойтись без фактической необходимости скопировать файлы.
$ rsync -avz --dry-run --verbose --include='fo[12]/' --exclude='fo*/' \
Main_Dir/ new_Main_Dir/.
Пробный прогон.
$ rsync -avz --dry-run --include='fo[12]/' --exclude='fo*/' \
Main_Dir/ new_Main_Dir/.
sending incremental file list
./
Subdir1/
Subdir1/fo1/
Subdir1/fo2/
Subdir2/
Subdir2/fo1/
Subdir2/fo2/
Subdir3/
Subdir3/fo1/
Subdir3/fo2/
sent 201 bytes received 51 bytes 504.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
Если Вы хотите видеть часть из rsync
внутренняя логика относительно того, что включается/исключается затем, использует --verbose
переключатель.
$ rsync -avz --dry-run --verbose --include='fo[12]/' --exclude='fo*/' \
Main_Dir/ new_Main_Dir/.
sending incremental file list
[sender] showing directory Subdir1/fo2 because of pattern fo[12]/
[sender] showing directory Subdir1/fo1 because of pattern fo[12]/
[sender] hiding directory Subdir1/fo3 because of pattern fo*/
[sender] showing directory Subdir2/fo2 because of pattern fo[12]/
[sender] showing directory Subdir2/fo1 because of pattern fo[12]/
[sender] hiding directory Subdir2/fo3 because of pattern fo*/
[sender] showing directory Subdir3/fo2 because of pattern fo[12]/
[sender] showing directory Subdir3/fo1 because of pattern fo[12]/
[sender] hiding directory Subdir3/fo3 because of pattern fo*/
delta-transmission disabled for local transfer or --whole-file
./
Subdir1/
Subdir1/fo1/
Subdir1/fo2/
Subdir2/
Subdir2/fo1/
Subdir2/fo2/
Subdir3/
Subdir3/fo1/
Subdir3/fo2/
total: matches=0 hash_hits=0 false_alarms=0 data=0
sent 201 bytes received 51 bytes 504.00 bytes/sec
total size is 0 speedup is 0.00 (DRY RUN)
Если необходимо исключить другие формы каталогов, можно добавить, что несколько исключают.
Использовать rsync
:
rsync -av --exclude="f03" /path/to/Main_Dir/ /pth/to/destination
Вы могли попробовать что-то вроде этого:
find Main_Dir -maxdepth 1 -mindepth 1 -type d | while IFS= read -r subdir; do
mkdir -p new_dir/"$(basename $subdir)" &&
cp -r "$subdir"/{fo1,fo2} new_dir/"$(basename $subdir)"/;
done
find
управляйте возвращает все прямые подкаталоги Main_Dir. basename
возвратит название найденного подкаталога (например. basename Main_Dir/Subdir1
возвраты Subdir1
). Вы затем используете расширение фигурной скобки оболочки, чтобы не вводить fo1
и fo2
многократно и скопируйте их в недавно созданный new_dir/$(basename $subdir)
каталог.
В конкретном случае Вы упоминаете, где существуют только каталоги под Main_Dir
и где нет никаких пробелов или странных символов на имена, Вы могли упростить вышеупомянутое до
cd Main_Dir; for subdir in *; do
mkdir -p ../new_dir/$subdir && cp -rv $subdir/{fo1,fo2} ../new_dir/$subdir;
done
Если Ваша структура каталогов точно как в Вашем примере (т.е. весь fo
файлы находятся на том же уровне):
mkdir -p New_Dir/{Subdir1,Subdir2,Subdir3}
for subdir in Subdir1 Subdir2 Subdir3;do
cp -r Main_Dir/"$dir"/{fo1,fo2} New_Dir/"$dir"/
done