copier les fichiers du répertoire / sous-répertoire indiqué dans le fichier texte (Mac)

0

Je cherche à rechercher puis à copier tous les fichiers dont les noms de fichier correspondent dans un fichier texte d'un répertoire (avec des sous-répertoires) d'un serveur vers un autre répertoire. J'ai trouvé une excellente solution (bien que très lente) pour Windows ici .

dans un fichier .bat, quelque chose comme:

for /f "delims=" %%i in (text-list.txt) do echo D|xcopy "\\SERVER\FOLDER\%%i?" "c:\temp" /i /z /y /s

Comment puis-je accomplir cela sur Mac / Linux?

cela fonctionne pour les fichiers qui se trouvent tous dans le même répertoire, mais je ne vois pas comment rechercher des sous-répertoires dans le dossier source:

rsync --files-from ~/filelist.txt . ~/destfolder

basé sur l'exemple de @neofug, il s'agit d'un script Perl pour le faire. cela fonctionne bien sauf qu'il ne cherche pas dans les sous-dossiers du dossier src:

#!/usr/bin/env perl
use strict;
my $textFile = shift @ARGV;
my $filenames = {};
open F1, "<", $textFile or die "Cannot open file $textFile! $!\n";
while ( <F1> ){
  chomp;
  $filenames->{$_}++;
}
close(F1);
my $imgDir = "/Users/username/srcfolder";
chdir($imgDir);
my @imgList = glob "*.txt";
foreach(@imgList){
  if($filenames->{$_}){
    system("/bin/cp $_ /Users/username/destfolder");
  }
}
jamierob
la source
Avez-vous essayé quelque chose?
Raystafarian
oui, j'ai essayé avec rsync. J'ai inclus cet exemple ci-dessus maintenant.
jamierob
Vérifiez si cet article vous aide - montre comment utiliser les commandes "find" et "rsync" simultanément - unix.stackexchange.com/questions/87018/find-and-rysnc
Mike Diglio

Réponses:

1

Vous pouvez nous perl pour ce faire, entrez la liste des fichiers texte en tant qu'argument de ligne de commande et modifiez les chemins en fonction de votre configuration:

    #!/usr/bin/env perl
    use strict;
    use File::Find;
    my $textFile = shift @ARGV;
    my $filenames = {};
    open F1, "<", $textFile or die "Cannot open file $textFile! $!\n";
    while ( <F1> ){
      chomp;
      $filenames->{$_}++;
    }
    close(F1);
    my $imgDir = "/home/user/Pictures/";
    my $imgList = {};
    find(\&findPics, "/home/user/Pictures/");
    foreach(keys %$imgList){
      if($filenames->{$_}){
        system("/bin/cp $imgList->{$_} /path/to/newImages/");
      }
    }
    sub findPics{
      if($_ =~ /.+[jpg|jpeg|png|gif]/i){
        $imgList->{$_} = $File::Find::name;
      }
    }

Edit: J'ai modifié ce programme à la demande de l'opérateur pour qu'il recurse dans le répertoire donné afin de trouver toutes les images.

neofug
la source
Je vous remercie! Je n'ai jamais utilisé perl auparavant, mais c'est une excellente solution. Cela fonctionne pour moi sauf que cela ne recherche pas dans les sous-dossiers du dossier src. J'ai ajouté le bit ci-dessus modifié à partir de votre exemple. Une idée sur la façon de le faire rechercher récursivement? Merci!
jamierob