2017-07-14 7 views
0

Je souhaite annuler une commande de déplacement en replaçant tous les fichiers d'un dossier ("MySourceDir") dans les chemins correspondants spécifiés dans a. fichier txt ("ListOfFilePaths.txt).Déplacer plusieurs fichiers d'un dossier vers la liste des répertoires (Annuler une commande de déplacement)

pour exemple .:

MySourceDir 

File1.txt 
File2.txt 
File3.txt 
. 
. 
. 

J'ai un fichier texte contenant les chemins de fichiers pour chacun de ces fichiers, ce qui indique les répertoires qu'ils étaient à l'origine et donc, le besoin être ramené à.

ListOfFilePaths.txt 

/path/to/dirA/File1.txt 
/path/to/dirB/File2.txt 
/path/to/dirC/File3.txt 

Je pourrais probablement le faire de deux façons. Ecrire une boucle à 1) grep le chemin du répertoire pour chaque fichier, puis le déplacer vers le chemin du répertoire grepped correspondant OU 2) supprimer la partie "File # .txt" du chemin du répertoire, puis faire une commande mv pour chaque fichier dans le liste telle que le nième fichier est déplacé vers le nième répertoire.

Dans les deux cas, je ne suis pas familier avec l'écriture de boucles dans bash, donc toute aide serait très appréciée! (De même, apprécierions également une commande pour copier ces fichiers dans le dossier d'origine au lieu de les déplacer, en gardant l'horodatage inchangé :-))

+0

simple serait d'utiliser un bon éditeur de texte qui offre la sélection de blocs et l'entrée de plusieurs lignes. Ensuite, vous pouvez simplement convertir ce fichier en un script contenant une commande mv par ligne. Quelque chose que vous pouvez contrôler et vérifier. Pas de boucles, rien d'extraordinaire, tu sais ce que tu fais. – arkascha

Répondre

0

D'après ce que je comprends, vous devez:

  • boucle dans le fichier texte
  • Obtenez la ligne, extraire le texte après la barre oblique finale (pour vous donner le nom du fichier)
  • Obtenez le répertoire de destination de la ligne
  • Copiez le fichier de la source dir à la dest dir

Le code ci-dessous devrait vous aider:

while read line; do 
    fileName=$(basename $line) 
    dirName=$(dirname $line) 
    cp SourceDir/"$fileName" "$dirName" 
done < ListOfFilePaths.txt 

basename extrait le nom de fichier à partir d'un chemin de fichier. dirname extrait le répertoire d'un chemin de fichier.

Références:

https://ss64.com/bash/dirname.html

https://linux.die.net/man/1/basename

+0

Merci de suggérer ceci. Quand je l'essaye avec un cas de test, et fais "echo fileName" au lieu de la commande "cp", il me renvoie cette erreur: 'fileName: commande introuvable dirName: commande non trouvée' – AHegde

+0

@AHegde C'est parce que vous besoin de faire 'echo" $ fileName ";' et 'echo" $ dirName ";'. – mfisher91