Копирование определенных подпапок со структурой каталогов к новой папке

Команда может непосредственно записать в /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
8
08.11.2013, 22:38
4 ответа

Если дерево каталогов является больше, чем просто ..../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)

Если необходимо исключить другие формы каталогов, можно добавить, что несколько исключают.

4
27.01.2020, 20:12

Использовать rsync:

rsync -av --exclude="f03" /path/to/Main_Dir/ /pth/to/destination
3
27.01.2020, 20:12

Вы могли попробовать что-то вроде этого:

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
0
27.01.2020, 20:12

Если Ваша структура каталогов точно как в Вашем примере (т.е. весь 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
0
27.01.2020, 20:12

Теги

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