2008-12-12 11 views
2

Je voudrais savoir s'il est possible de copier/déplacer des fichiers vers une destination en fonction du nom d'origine.bash scripting.Copier des fichiers sans écraser

Fondamentalement, j'ai un dossier/mail, qui a plusieurs sous-dossiers tels que cur et new etc. J'ai alors une sauvegarde extraite dans/mail/home/username qui est un doublon. mv -f ne fonctionnera pas, car je n'ai pas la permission d'écraser les répertoires, mais seulement les fichiers qu'il contient.

Je reçois des erreurs telles que mv: ne peut pas écraser le répertoire `/home/username/mail/username.com »

Ce que je veux faire est pour chaque fichier dans le répertoire username.com, déplacez-la dossier du même nom dans/mail. Il pourrait y avoir un certain nombre de dossiers à la place de username.com, avec leurs propres sous-sections.

Quelle est la meilleure façon de faire cela?

Je dois le faire de cette façon, car en raison de circonstances, je n'ai accès à mon hôte avec ftp et bash via PHP.

modifier: clarification

Je pense que je dois clarifier ce qui est arrivé. Je suis sur un hôte partagé et je n'ai apparemment pas accès en écriture aux répertoires eux-mêmes. Au moins les principaux tels que mail et public_html. J'ai fait une sauvegarde de ~/mail avec tar, mais en essayant de l'extraire extrait à ~/mail/home/mail etc, car j'ai oublié le chemin complet. Maintenant, je ne peux pas simplement dénouer parce que le chemin est faux, et je ne peux pas mv -f parce que j'ai seulement un accès en écriture aux fichiers, pas aux répertoires.

Répondre

2

Pour la copie, vous devriez envisager d'utiliser cpio en mode 'passe' (-p):

cd /mail; find . -type f | cpio -pvdmB /home/username/mail 

Le -v est verbeux; -d crée des répertoires si nécessaire; -m préserve les heures de modification sur les fichiers; -B signifie utiliser une taille de bloc plus grande, et peut être hors de propos ici (cela avait l'habitude de faire la différence quand on joue avec des périphériques à bande). Omis de cette liste est l'indicateur -u qui effectue la copie inconditionnelle, écrasant les fichiers préexistants dans la zone cible. La commande cd s'assure que les noms de chemin sont corrects; si vous venez de faire:

find /mail -type f | cpio -pvdmB /home/username 

vous obtenir le même résultat, mais seulement par hasard - parce que le sous-répertoire sous /home/username était le même que le chemin absolu de l'original. Si vous avez besoin de faire:

find /var/spool/mail -type f | cpio -pvdmB /home/username/mail 

alors les fichiers copiés seraient trouvés sous /home/username/mail/var/spool/mail, ce qui est peu susceptible d'être ce que vous aviez à l'esprit.

Vous pouvez obtenir un effet similaire avec (GNU) tar:

(cd /mail; tar -cf - .) | (cd /home/username/mail; tar -xf -) 

Ce répertoires copie, pas seulement les fichiers. Pour ce faire, vous avez besoin GNU uniquement les installations:

(cd /mail; find . -type f | tar -cf - -F -) | (cd /home/username/mail; tar -xf -) 

Le premier tiret solo signifie « écrire à stdout »; le second signifie 'read from stdin'; l'option '-F' signifie 'lire les noms de fichiers à copier à partir du fichier nommé'.

0

Je ne suis pas tout à fait clair sur ce qu'il est que vous voulez faire, mais vous pouvez essayer ce qui suit:

for file in /mail/*; do 
    mv -f $file /home/username/mail/$(basename $file) 
done 

Cela déplacera tous les fichiers et sous-répertoire/courrier de là dans/home/nom d'utilisateur/mail.

+0

Je pense que c'est l'inverse de ce que je veux faire? J'ai extrait une archive mail dans le dossier mail, mais elle a créé un sous-répertoire que je ne peux plus restaurer, car je ne peux pas réécrire les répertoires originaux –

0

Utilise tar une option? Vous pouvez tar dans le répertoire, et l'extraire sous /mail/ (car je suppose que c'est ce que vous voulez à peu près) avec tar écraser les fichiers et les répertoires existants.

+0

C'est ce que j'ai essayé, le problème est que je ne peux écraser que les fichiers –

0

Je suis un peu confus au sujet de ce que vous voulez exactement faire. Mais vous devriez être capable d'utiliser l'approche de la solution d'Adam et rediriger les erreurs dans un fichier.

for file in /mail/*; do 
    mv -f $file /home/username/mail/$(basename $file) 2> /tmp/mailbackup.username.errors 
done 

ANNUAIRES ne seront pas écrasées et vous pouvez vérifier le fichier afin qu'il ne contaions erreurs que vous anticipez.

+0

Le problème est que je ne peux pas écraser les répertoires, seulement les fichiers, et que mon archive de courrier est actuellement dans un sous-répertoire de courrier. La restauration semble impossible avec des outils normaux. –

+0

Oui, mais je pense que si vous essayez quelque chose comme ce que je suggère vous obtiendrez tous les fichiers déplacés et tous les messages d'erreur de npt pouvant écraser les répertoires seront redirigés vers le fichier journal. – PEZ

0

Pouvez-vous le détacher à nouveau? L'option -P à tar ne déshabillera pas "/", donc les chemins absolus seront respectés. De votre édition, il semble que cela va le réparer.

+0

J'ai essayé cela, il donne l'erreur: tar:/home/nom d'utilisateur/mail: Pas trouvé dans l'archive après avoir essayé avec tar xzvfP ~/new/moremail.tgz ~/mail –

+0

Er, cela signifie que vous voulez seulement l'article "~/mail "dans l'archive à extraire. –

+0

J'ai utilisé -P dans le répertoire racine, et/mail est également dans le répertoire racine. Il vient d'extraire le dossier/home/nom d'utilisateur/mail, je ne peux pas l'obtenir pour extraire seulement le dossier de courrier .. –

0

Même avec votre clarification, j'ai toujours du mal à comprendre exactement ce que vous faites. Cependant, toute chance que vous pouvez utiliser rsync? Les hôtes src et dest peuvent être le même hôte pour rsync. Si je me souviens bien, vous pouvez demander à rsync de ne mettre à jour que les fichiers qui existent déjà dans la zone de destination (--existing) et aussi d'ignorer les changements de répertoire (--omit-dir-times). Encore une fois, je ne comprends pas très bien vos besoins ici, mais rsync est très flexible dans la sauvegarde de fichiers et de répertoires.

Bonne chance.

+0

Aah, je vois que vous avez seulement accès à ftp et bash. Eh bien, peu importe, je suppose. – shank

Questions connexes