Movimento recursivo seletivo?

2

Existe um comando como

mv --preserve-structure src src/1 src/2/3 dst

que cria dst/1 e dst/2/3 ? Deve funcionar de forma semelhante a mv src/* dst , mas mova apenas as subárvores listadas.

    
por maaartinus 21.03.2011 / 18:42

3 respostas

0

No Linux, usando rename dos utilitários do Linux ( rename.ul no Debian e Ubuntu):

rename src dst src/1 src/2/3     # dst/2 must exist

Com o script rename Perl que o Debian e o Ubuntu instalam como prename ou rename :

rename 's!^src!dst!' src/1 src/2/3    # dst/2 must exist
rename 'use File::Basename; use File::Path;
        s!^src!dst! && mkpath(dirname($_))' src/1 src/2/3

Aqui está uma função shell que faz o que você está pedindo, exceto pela ordem do argumento:

mv-preserving-structure () {
  s=${1%/} t=${2%/}; shift 2
  for x; do
    case $x in
      $s/*)
        y=$t${x#$s}
        mkdir -p -- "${y%/*}"
        mv -- "$x" "$t${x#$s}";;
    esac
  done
}
mv-preserving-structure src dst src/1 src/2/3
    
por 21.03.2011 / 21:07
1
> tar -cf - src/1 src/2/3 | (mkdir dst; cd dst; tar -xv --strip-components=1  -f -)
    
por 21.03.2011 / 21:02
1

Supõe que o bash e o GNU encontrem.

mv_preserve_structure() {
  local src_file="$1"
  local dest="$2"
  local rel_dir="$(dirname "$src_file")/"
  rel_dir="${rel_dir#*/}"  # returns "2/3" if rel_dir was "src/2/3"
  mkdir -p "$dest/$rel_dir"
  mv "$src_file" "$dest/$rel_dir"
}

# unlike mv, this requires the destination dir as the first parameter
mv_dirs() {
  local dest="$1"
  shift
  for dir in "$@"; do
    for filename in "$dir"/*; do
      [[ -f "$filename" ]] && mv_preserve_structure "$filename" "$dest"
    done
  done
}

mv_dirs dst src src/1 src/2/3
    
por 21.03.2011 / 20:13