Comment forcer l'écrasement des répertoires non vides en utilisant `mv`

17

Je veux déplacer (pas seulement copier) un groupe de fichiers / répertoires vers un répertoire différent dont certains ont des conflits de noms avec des fichiers / répertoires dans le répertoire cible. Mon objectif principal est de déplacer les fichiers, afin que je puisse tolérer l'écrasement du répertoire non vide.

J'utilise actuellement mv ... destinationcependant, parfois je reçois

mv: impossible de déplacer `cible 'vers / destination / cible': répertoire non vide

J'ai essayé mv -f ... destinationsans succès et comme je veux que les fichiers disparaissent de leur emplacement d'origine, rsynccela ne semble pas approprié.

En prime, existe-t-il une bonne solution pour conserver les fichiers destinés à être remplacés d'une manière ou d'une autre en renommant?

user1227038
la source
Et quelle erreur obtenez-vous lorsque vous essayez votre commande mv?
suspectus
Vous dites explicitement que ce rsyncn'est pas ce que vous voulez; pourquoi avez-vous marqué cela rsync?
DopeGhoti
@DopeGhoti J'ai dit que cela ne semblait pas approprié, mais je suis disposé à montrer le contraire.
user1227038
@suspectus Question mise à jour.
user1227038
1
si vous utilisez use mv --backup=numberedou l'une des autres options pour le --backupcommutateur, alors mvterminera la fusion et conservera les fichiers destinés à être écrasés
bsd

Réponses:

19

Si vous utilisez mv --backup=numbered
(ou l'une des autres options pour le --backupcommutateur),
alors mvterminera la fusion et conservera les fichiers destinés à être remplacés.

bsd
la source
réponse stupide - cela polluera votre lecteur avec des .~1~dossiers
Toolkit
0
#!/bin/bash
SAVEIFS=$IFS
IFS=$(echo -en "\n\b")
SRC=/path/to/source
DST=/path/to/destination

for item in $SRC/*; do
    if [[ -f "$DST/$(basename "$item")" ]]; then
        newitem=$(basename $item)_old
        while [[ -f "$DST/$newitem" ]]; do
            newitem=${newitem}_old
        done
        mv "$DST/$(basename $item)" "$DST/$newitem"
    fi
    mv "$item" "$DST/$(basename $item)"
done
DopeGhoti
la source
1
Au lieu de ce script, on pourrait directement exécuter le cpsuivi de la mvcommande.
reza.safiyat
0

Vous pouvez utiliser mc(Midnight Commander) à l'intérieur de l'écran et des dossiers avec avec InsetF6

Boîte à outils
la source