GNU/Linux >> Tutoriels Linux >  >> Linux

Fusionner 2 arborescences de répertoires sous Linux sans copier ?

Solution 1 :

rsync -ax --link-dest=dir1/ dir1/ merged/
rsync -ax --link-dest=dir2/ dir2/ merged/

Cela créerait des liens physiques plutôt que de les déplacer, vous pouvez vérifier qu'ils ont été déplacés correctement, puis supprimer dir1/ et dir2/ .

Solution 2 :

C'est étrange que personne n'ait noté que cp a l'option -l :

-l, --link
       hard link files instead of copying

Vous pouvez faire quelque chose comme

% mkdir merge
% cp -rl dir1/* dir2/* merge
% rm -r dir*
% tree merge 
merge
├── a
│   ├── file1.txt
│   ├── file2.txt
│   ├── file5.txt
│   └── file6.txt
├── b
│   ├── file3.txt
│   ├── file7.txt
│   └── file8.txt
└── c
    ├── file10.txt
    ├── file4.txt
    └── file9.txt

13 directories, 0 files

Solution 3 :

Vous pouvez utiliser rename (alias prename, du package perl) pour cela. Attention, le nom ne fait pas nécessairement référence à la commande que je décris en dehors de debian/ubuntu (bien qu'il s'agisse d'un seul fichier perl portable si vous en avez besoin).

mv -T dir1 merged
rename 's:^dir2/:merged/:' dir2/* dir2/*/*
find dir2 -maxdepth 1 -type d -empty -delete

Vous avez également la possibilité d'utiliser vidir (de moreutils) et de modifier les chemins d'accès aux fichiers à partir de votre éditeur de texte préféré.

Solution 4 :

J'aime le rsync et prénom solutions, mais si vous voulez vraiment faire mv faire le travail et

  • votre trouvaille connaît -print0 et -depth ,
  • vos xargs connaît -0 ,
  • vous avez printf ,

alors il est possible de gérer un grand nombre de fichiers qui pourraient avoir des espaces blancs aléatoires dans leurs noms, le tout avec un script shell de style Bourne :

#!/bin/sh

die() {
    printf '%s: %s\n' "${0##*/}" "$*"
    exit 127
}
maybe=''
maybe() {
    if test -z "$maybe"; then
        "[email protected]"
    else
        printf '%s\n' "$*"
    fi
}

case "$1" in
    -h|--help)
        printf "usage: %s [-n] merge-dir src-dir [src-dir [...]]\n" "${0##*/}"
        printf "\n    Merge the <src-dir> trees into <merge-dir>.\n"
        exit 127
    ;;
    -n|--dry-run)
        maybe=NotRightNow,Thanks.; shift
    ;;
esac

test "$#" -lt 2 && die 'not enough arguments'

mergeDir="$1"; shift

if ! test -e "$mergeDir"; then
    maybe mv "$1" "$mergeDir"
    shift
else
    if ! test -d "$mergeDir"; then
        die "not a directory: $mergeDir"
    fi
fi

xtrace=''
case "$-" in *x*) xtrace=yes; esac
for srcDir; do
    (cd "$srcDir" && find . -print0) |
    xargs -0 sh -c '

        maybe() {
            if test -z "$maybe"; then
                "[email protected]"
            else
                printf "%s\n" "$*"
            fi
        }
        xtrace="$1"; shift
        maybe="$1"; shift
        mergeDir="$1"; shift
        srcDir="$1"; shift
        test -n "$xtrace" && set -x

        for entry; do
            if test -d "$srcDir/$entry"; then
                maybe false >/dev/null && continue
                test -d "$mergeDir/$entry" || mkdir -p "$mergeDir/$entry"
                continue
            else
                maybe mv "$srcDir/$entry" "$mergeDir/$entry"
            fi
        done

    ' - "$xtrace" "$maybe" "$mergeDir" "$srcDir"
    maybe false >/dev/null ||
    find "$srcDir" -depth -type d -print0 | xargs -0 rmdir
done

Solution 5 :

Force brute bash

#! /bin/bash

for f in $(find dir2 -type f)
do
  old=$(dirname $f)
  new=dir1${old##dir2}
  [ -e $new ] || mkdir $new
  mv $f $new
done

le test fait ça

# setup 
for d in dir1/{a,b,c} dir2/{a,b,c,d} ; do mkdir -p $d ;done
touch dir1/a/file{1,2} dir1/b/file{3,4} dir2/a/file{5,6} dir2/b/file{7,8} dir2/c/file{9,10} dir2/d/file11

# do it and look
$ find dir{1,2} -type f
dir1/a/file1
dir1/a/file2
dir1/a/file5
dir1/a/file6
dir1/b/file3
dir1/b/file7
dir1/b/file8
dir1/c/file4
dir1/c/file9
dir1/c/file10
dir1/d/file11

Linux
  1. Pwd sans liens symboliques ?

  2. Commande de chat Linux

  3. Comment empêcher la modification, la suppression et le changement de nom de fichier/répertoire sous Linux ?

  4. Commande de déplacement de répertoire Linux

  5. Linux :comparer la structure des répertoires sans comparer les fichiers

Commande principale Linux

Commande Du sous Linux

Commande mv sous Linux

Comment basculer automatiquement vers un répertoire sans utiliser la commande cd sous Linux

Comment copier un répertoire sous Linux

Linux :ajouter un répertoire à PATH