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

8

У меня следующая структура каталогов:

                Main_Dir
                   |
  -----------------------------------
  Subdir1       Subdir2       Subdir3
     |             |             |
 ---------     ---------     ---------
 |   |   |     |   |   |     |   |   |            
fo1 fo2 f03   fo1 fo2 f03   fo1 fo2 f03

Я хочу , чтобы скопировать все подкаталоги ( Subdir1, Subdir2, Subdir3) в новую папку. Но я хочу только скопировать fo1и fo2папки на новом месте.

Не уверен, как это можно сделать.

Shan
источник
Скопировать все, удалить fo3?
ChuckCottrill

Ответы:

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)

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

SLM
источник
3

Используйте rsync:

rsync -av --exclude="f03" /path/to/Main_Dir/ /pth/to/destination
Раду Рэдяну
источник
0

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

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возвратит имя подкаталога FOUND (например , 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

Если ваша структура каталогов точно такая же, как в вашем примере (т.е. все 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
Джозеф Р.
источник