J'ai un répertoire de nombreux fichiers, quelque chose comme 50 000 pdf et autres fichiers sur un serveur. Je dois déplacer des spécifiques dans un autre répertoire. Je peux générer une liste des fichiers qui doivent être déplacés au format CSV ou dans tout autre format de texte.
Ce que je dois faire, c'est exécuter un script bash et déplacer ou copier les fichiers répertoriés dans le fichier texte dans un autre répertoire.
Y at-il un moyen facile de le faire? Toute suggestion ou ressource serait grandement appréciée.
Réponses:
rsync a plusieurs options qui peuvent prendre une liste de fichiers à traiter (
--files-from
,--include-from
, etc.).Par exemple, cela fera l'affaire:
la source
rsync -a /source/directory --files-from=/full/path/to/listfile /destination/directory
Afin d'éviter une utilisation inutile de
cat
(et si vous n'utilisez pasrsync
):Cela gérera n'importe quel nom de fichier valide, à moins qu'il ne contienne une nouvelle ligne, si les fichiers sont listés un par ligne.
la source
mv
sera réduite à un seul et même répertoire de destination. L'rsync
approche dans la réponse acceptée ne souffre pas de cette limitation.en supposant que bash, plus
listoffiles
contenant un fichier par ligne. Ma seule objection à la route rsync est que le PO demande une méthode pour déplacer les fichiers, pas pour les copier. rsync a plus de drapeaux qu'un mariage royal, donc je suis sûr qu'il peut être modifié pour le faire, mais parfois, plus c'est simple, mieux c'est!la source
while read -r file; do mv "$file" /path/of/destination ; done < listoffiles
Cela dépend du format du fichier texte que vous avez. Par exemple, si vous avez écrit la liste des fichiers de sorte que chaque fichier se trouve sur une nouvelle ligne. Vous pouvez utiliser xargs comme:
En outre, vous pouvez utiliser la
find
commande avec-exec
option. copier / déplacer les fichiers.la source
Rsync présente un avantage supplémentaire par rapport aux commandes
cp
oumv
car il crée automatiquement des dossiers s’ils n’existent pas.la source
/path/to/source
nécessaire quand il prend les chemins de la liste de fichiers?Je pense que la réponse rsync est meilleure, mais juste pour une autre option:
la source
J'ai accidentellement copié le contenu complet d'un répertoire dans un répertoire de destination au lieu de déplacer le répertoire complet. Cela a abouti à un répertoire de destination encombré à la place du répertoire d'origine ajouté au répertoire.
Pour résoudre ce problème, j'ai fait ce qui suit:
ls -rt /path/to/cluttered/destination/directory/ > /opt/dircheck/filestomove
La commande ci-dessus crée le fichier filestomove qui sera une liste de tout le contenu du répertoire de destination, trié en sens inverse par le temps, du plus ancien au plus récent.Ensuite, j'ai créé un sous-répertoire du répertoire de destination désormais encombré dans lequel déplacer les éléments.
mkdir /path/to/cluttered/destination/directory/newsubdirectory
Ensuite, j'ai répété la liste des répertoires, sauf la liste à l'écran et l'affichage de plus de détails.
ls -lrht /path/to/cluttered/destination/directory/
Cette ligne répertorie le répertoire, trié par date ascendante (tri inversé par heure) et affiche plus d'informations, y compris l'horodatage de chaque fichier dans le répertoire de destination désormais encombré. Je me réfère à cela, en commençant par le haut pour montrer quels répertoires et fichiers je veux garder là où ils étaient. Il y aura un espace dans l'horodatage des fichiers où tous les nouveaux fichiers commencent qui ne devrait pas être là.Ensuite, j'ai édité le fichier filestomove créé à la première étape ci-dessus (qui est triée par date) et supprimé les quelques-uns de la liste précédemment présents que je souhaite rester dans le répertoire d'origine.
vim /opt/dircheck/filestomove
Supprimer du haut tous les fichiers que vous ne voulez pas déplacer.Ensuite, j'ai utilisé la commande répertoriée précédemment dans cet article pour déplacer les fichiers de ma liste dans le nouveau répertoire que j'ai créé.
sudo xargs -a /opt/dircheck/filestomove mv -t /path/to/cluttered/destination/directory/newsubdirectory
Cela a déplacé tous les fichiers en une fraction de seconde. (Remarque: vous n’avez peut-être pas besoin de sudo au début, c’est une question d’autorisations de fichier).
Maintenant, mon répertoire de destination d'origine est propre et contient un nouveau répertoire avec tous les fichiers et répertoires qui l'encombrent.
la source
Si (et seulement si), les noms de fichiers ne contiennent aucun caractère désagréable (espaces, nouvelles lignes, ce qui confondrait xargs sur la façon de diviser les éléments en arguments individuels), et vous générez une liste de fichiers séparés par des nouvelles lignes (un fichier par ligne), vous pouvez faire quelque chose comme.
(En général, voir man xargs , c'est génial)
Si votre mv particulier ne dispose pas de l'option -t, vous pouvez également faire des trucs comme
Remarque - aucun de ceux-ci ne fonctionnera comme prévu s'il y a des noms de fichiers contenant des nouvelles lignes.
la source
cp
,mv
Et autres n'ont pas l'-t
option sur bsd « s, et le second exemple avec n'a pas fonctionné sous - shell pour moi (/path/to/move
est ajouté comme le dernier nom de fichier)(cat filenames.txt; echo; echo /path/to/move/files/to) | xargs mv
Essayez quelque chose comme:
la source
while read line; do mv $line /images; done < list.txt
comme une seule commandeCe qui suit a fonctionné pour moi où je devais copier tous les fichiers PNG d'un chemin spécifique (et de tous les sous-répertoires) vers un nouvel emplacement tout en préservant la structure de répertoires:
Comme RSYNC crée d'abord le miroir de la structure de répertoires, puis synchronise les fichiers, vous pouvez vous retrouver avec des dossiers en excès vides. J'ai utilisé le drapeau --prune-empty-dirs pour supprimer ces répertoires vides.
Je n'ai aucune affiliation, mais je pensais juste de donner crédit à la source qui a inspiré cette solution: http://techblog.zabuchy.net/2011/transfer-only-selected-file-types-with-rsync/
la source