48 votes

Linux (mv ou cp) des fichiers spécifiques à partir d'une liste de fichiers texte ?

J'ai un répertoire de nombreux fichiers, quelque chose comme 50 000 pdf et autres fichiers sur un serveur. J'ai besoin de déplacer des fichiers spécifiques vers un autre répertoire. Je peux générer une liste des fichiers qui doivent être déplacés en format csv ou tout autre format texte.

Je dois exécuter un script bash script et déplacer ou copier les fichiers répertoriés dans le fichier texte vers un autre répertoire.

Existe-t-il un moyen simple de procéder ? Toute suggestion ou ressource serait grandement appréciée.

2voto

dF. Points 29787

Si (et seulement si), vous n'avez pas de caractères gênants dans les noms de fichiers (espaces, retours à la ligne, ce qui rendrait xargs confus sur la façon de décomposer les choses en arguments individuels), et que vous générez une liste de fichiers séparés par des retours à la ligne (un fichier par ligne), vous pourriez faire quelque chose comme.

cat filenames.txt | xargs mv -t /path/to/move/files/to

(En général, voir homme xargs c'est génial)

Si votre mv particulier n'a pas l'option -t, vous pouvez aussi faire des trucs comme

( cat filenames.txt; echo; echo /path/to/move/files/to ) | xargs mv

Remarque : aucune de ces méthodes ne fonctionnera comme prévu si les noms de fichiers contiennent des nouvelles lignes.

2voto

Curt Hagenlocher Points 12432

Je pense que la réponse de rsync est meilleure, mais c'est juste une autre option :

tar -cf - -T FILE_OF_FILENAMES_TO_MOVE.txt |(cd /path/to/new/dir && tar -xvf -)

1voto

Darren Points 113

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. Il en a résulté un répertoire de destination encombré au lieu d'ajouter le répertoire d'origine au répertoire.

Pour résoudre ce problème, j'ai procédé comme 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 tous les contenus du répertoire de destination, triés à l'envers par ordre chronologique, c'est-à-dire du plus ancien au plus récent.

J'ai ensuite créé un sous-répertoire du répertoire de destination, désormais encombré, dans lequel j'ai déplacé mes affaires.

mkdir /path/to/cluttered/destination/directory/newsubdirectory

J'ai ensuite répété la liste de l'annuaire, mais en l'affichant à l'écran et en donnant plus de détails.

ls -lrht /path/to/cluttered/destination/directory/ Cette ligne dresse la liste du répertoire, triée par date ascendante (tri inverse par heure) et affiche davantage d'informations, notamment l'horodatage de chaque fichier dans le répertoire de destination désormais encombré. Je m'y réfère, en commençant par le haut, pour indiquer les répertoires et les fichiers que je souhaite conserver à l'endroit où ils se trouvaient. Il y aura un vide dans l'horodatage des fichiers là où commencent tous les nouveaux fichiers qui ne devraient pas être là.

J'ai ensuite édité le fichier filestomove créé lors de la première étape ci-dessus (qui est trié par date) et j'ai supprimé de la liste les quelques éléments qui s'y trouvaient précédemment et que je souhaite conserver dans le répertoire d'origine.

vim /opt/dircheck/filestomove Supprimez, en partant du haut, tous les fichiers que vous ne souhaitez pas déplacer.

Ensuite, j'ai utilisé la commande citée précédemment dans ce billet pour déplacer les fichiers de ma liste vers le nouveau répertoire que j'ai créé.

sudo xargs -a /opt/dircheck/filestomove mv -t /path/to/cluttered/destination/directory/newsubdirectory

Tous les fichiers ont ainsi été déplacés en une fraction de seconde. (Note : vous n'avez peut-être pas besoin du sudo au début, c'est une question de permissions de fichiers).

Mon répertoire de destination d'origine est maintenant propre et contient un nouveau répertoire avec tous les fichiers et répertoires qui l'encombraient.

1voto

AliGibbs Points 2273

Essayez quelque chose comme :

cat list.txt | while read line; do mv "$line" /images; done

0voto

La procédure suivante m'a permis de 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 du répertoire :

rsync -av --prune-empty-dirs --include='*/' --include='*.png' --exclude='*' source/ destination/

Comme RSYNC crée d'abord le miroir de la structure des répertoires, puis synchronise les fichiers, vous pouvez vous retrouver avec des dossiers vides en trop. J'ai utilisé l'option --prune-empty-dirs pour supprimer ces répertoires vides.

Je n'ai aucune affiliation, mais j'ai pensé qu'il était juste de donner crédit à la source qui a inspiré cette solution : http://techblog.zabuchy.net/2011/transfer-only-selected-file-types-with-rsync/

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X