Copiando apenas diretórios com arquivos

1

Estou tentando copiar arquivos e o diretório para outro local. Eu posso encontrar o caminho assim:

find ~/dim_import/* -type f ! -name xdir | cut -d '/' -f 5-10

quais saídas

general/header.txt
scripts/test
scripts/tt

Como faço para copiá-los para outro local? Por exemplo, o novo local seria

new/general/header.txt
new/scripts/test
new/scripts/tt

O problema é que existem mais diretórios que estão vazios e eu não quero copiá-los, apenas os diretórios que possuem arquivos neles e os próprios arquivos.

NOTA: não usando bash , usando sh .

    
por James 10.07.2015 / 23:01

4 respostas

0

Acabei de gravar em um arquivo:

find ~/dim_import/* -type f ! -name xdir | cut -d '/' -f 5-6 > files

e, em seguida, percorrendo o arquivo "files" e criando os diretórios a partir dele e copiando os arquivos para lá.

while read line; do
  fileDir='echo "$line" | cut -d '/' -f 1'    # get folder name
  fileName='echo "$line" | cut -d '/' -f 2'   # get file name
  cd ~/"sr${srNum}"                           # go to SR folder

  # If proper directory doesn't exist, create
  if [ ! -d "$fileDir" ]; then 
    mkdir "$fileDir"
  fi

  # Copy file to respected directory
  cd $ROOT                                        # go back to dim_import
  cp "$fileDir/$fileName" ~/"sr$srNum/$fileDir"   # copy file to fileDir folder
  cd ~/"sr$srNum/$fileDir"                        # go to fileDir
  chmod u+w "$fileName"                  # mod the file for write access for changes
  cd $ROOT                                        # go back to dim_import
done < files
    
por 15.07.2015 / 15:02
1

Aqui está um método que usa apenas recursos de POSIX shell:

find ~/dim_import/* -type f ! -name xdir -exec sh -c '
  p=${1%/*}; 
  d=${p##*/}; 
  f=${1##*/}; 
  mkdir -p new/"$d"; 
  cp "$1" new/"$d"' -- {} \;
    
por 10.07.2015 / 23:22
0

xargs devem estar disponíveis. Você poderia usar:

find ~/dim_import/* -type f ! -name xdir | xargs -I {} cp {} new/{}
    
por 10.07.2015 / 23:11
0

Como você já sabe como filtrar os arquivos, use a cópia recursiva: cp -R

Ou você pode usar apenas a opção rsync with --prune-empty-dirs .

rsync --exclude='*xdir*' --prune-empty-dirs ~/dim_import ~/new

Nota: Se você não usar a barra final da fonte (como no exemplo acima), dim_import também será copiado.

    
por 12.07.2015 / 18:46