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?


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.


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

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.