2015-08-25 2 views
-2

У меня есть специальное требование, и мне нужна ваша помощь при написании сценария оболочки.Сценарий оболочки для копирования структуры каталогов на основе условия

  1. Скрипт должен скопировать структуру каталогов из исходного пути к целевому пути, сохраняющее разрешения, временному метки и т.д.
  2. Скрипт должен копировать только текстовые файлы только из этих подкаталогов, при которых нет более подкаталогов ,

Это то, что я сделал до сих пор.

#!/bin/bash 

    source_exist=false 

    while true 
    do 
     echo -n "Enter source path:" 
     read source 

    if [ ! -d $source ] 
    then 
     echo "$source is not a valid directory!!!" 
     echo -n "Try Again [Y/N]" 
     read result 
     if [ $result = 'Y' -o $result = 'y' ] 
     then 
      continue 
     else 
      exit 1; 
     fi 
    else 
     source_exist=true 
     break; 
    fi 
done 
echo -n "enter target path:" 
read target 
if [ source_exist ] 
then 
mkdir $target 
fi 
find $source '*.txt' -exec cp -p --parents \{\} $target \; 
+2

Добро пожаловать в SO. Пожалуйста, ознакомьтесь с рекомендациями по правильному заданию вопросов. Короче говоря, это место, где вы показываете нам, что вы сделали до сих пор (ваш код), и мы стараемся помочь вам в том, где вы застряли. – ODelibalta

+0

@ user3322633 Просьба поделиться своим кодом, что у вас есть. – kenorb

+0

Как вы определяете, какие файлы являются текстовыми файлами? По расширению или по содержанию? Требование «листовых каталогов» является довольно интересным. Вам нужно иметь дело с именами неудобных команд (имена, содержащие outpé пунктуацию или пробелы или символы новой строки), или имена всех цивилизованных (набор переносных имен файлов: A-Za-z0-9_ плюс точка и тире)? –

ответ

0

Вот что я сделал:

  • Сначала я копирую всю структуру каталогов, как это без копирования каких-либо файлов.

  • Тогда я искать каталог листьев в исходной папке и записать их в файл leafs.txt

  • Тогда я искать каталог листьев в целевую папку и записать их в другой файл leafd.txt

  • Так как структура каталогов одинакова, то вывод получается таким же как в текстовых файлах, просто с именем изменения стартового каталога.

  • Затем я читал оба файла одновременно по очереди и копировал текстовые файлы из линии исходного пути из leafs.txt в целевую линию пути из leafd.txt.

  • Имя исходного каталога задается пользователем, а целевой каталог создается сценарием с именем в качестве системной даты.

  • И наконец, файлы временных файлов leafs.txt и leafd.txt удаляются.

Также журнал штраф генерируется с именем даты системы, показывающей, какие файлы копируются из какого источника каталога, в котором целевом каталоге сохранение разрешения, метки времени и т.д.

Вот код:

1 #!/bin/bash 
    2 
    3 source_exist=false 
    4 
    5 while true 
    6 do 
    7  #Read source path 
    8  echo -n "Enter source path:" 
    9  read -r source 
    10 
    11  #If source is not a Direcotry 
    12  if [ ! -d "$source" ] 
    13  then 
    14   echo "$source is not a valid directory!!!" 
    15   echo -n "Try Again [Y/N]" 
    16   read -r result 
    17   if [ $result = "Y" -o $result = "y" ] 
    18   then 
    19    continue 
    20   else 
    21    exit 1; 
    22   fi 
    23  else 
    24   source_exist=true 
    25   break; 
    26  fi 
    27  done 
    28 
    29  target=$(date +%F) 
    30  touch $target.txt 
    31 
    32  if [ source_exist ] 
    33  then 
    34   #create target directory 
    35   mkdir -p $target 
    36  fi 
    37  #copy source direcotry structure only to the target 
    38  find $source -type d -printf "$target/%P\0" | xargs -0 mkdir -p 
    39 
    40  #find leaf directories in source and write them to a file 
    41  find $source -depth -type d | while read dir; do [[ ! $prev =~ $dir ]] && echo "${dir}" ; prev="$dir"; done > leafs.txt 
    42  #find leaf directories in target and write them to a file 
    43  find $target -depth -type d | while read dir; do [[ ! $prev =~ $dir ]] && echo "${dir}" ; prev="$dir"; done > leafd.txt 
    44  file1='leafs.txt' 
    45  file2='leafd.txt' 
    46  #read both the files simultaneously line by line and copy all .text file from source to destination 
    47  while IFS= read -r lineA && IFS= read -r lineB <&3; 
    48  do 
    49 
    50  #copy files preserving permission, timestamp etc. 
    51  cp --preserve -v "$lineA"/*.txt "$lineB" 2>/dev/null >> $target.txt 
    52 
    53 
    54  done <$file1 3<$file2 
    55  #remove the created text files 
    56  rm leafs.txt 
    57  rm leafd.txt 
    58  exit 0 
Смежные вопросы