Bash: Boucle sur les fichiers listés dans un fichier texte et de les déplacer
J'ai un répertoire (directory) avec 10 000 fichiers. Je veux déplacer une partie de leur répertoire B et les autres au répertoire C. j'ai fait un fichier texte qui contient les noms de tous les fichiers que je veux déplacer vers le répertoire B et une autre avec les noms de tous les fichiers que je veux déplacer vers le répertoire C. Comment puis-je écrire un bash pour la boucle de déplacer ces fichiers vers le nouveau répertoire.
Pseudocode:
un fichier dans textfileB:
déplacez le fichier de répertoire Un répertoire B
un fichier dans textfileC:
déplacer des fichiers d'Un répertoire vers le répertoire C
Désolé si cela est demandé à un autre endroit, mais j'ai passé des heures à essayer d'apprendre le bash et je n'ai tout simplement pas l'obtenir. Je n'étais pas capable de trouver quelque chose d'assez similaire dans un autre thread que j'ai pu comprendre (peut-être que je ne sais juste pas le droit de recherche de mots).
J'ai eu quelque chose comme cela, mais je ne pouvais pas le faire fonctionner:
FILES=[dont' know what goes here? An array? A list?
Puis-je simplement le texte nom de fichier et si oui quel format les fichiers? nom1.ext, nom2.ext, ou nom1.ext nom2.ext]
for f in $FILES; do mv $f /B/$f [not sure about the second argument for mv]; done
thx
BTW
Mac OSX 10.6.8 (Snow Leopard)
Apple Borne v. 2.1.2 /273.1
Bash 3.2
OriginalL'auteur PatentDeathSquad | 2011-07-04
Vous devez vous connecter pour publier un commentaire.
Je mettrais
"$i"
entre guillemets, de sorte que vous pouvez gérer les noms de fichiers avec des espaces et autres caractères qui ne figurent généralement dans une ligne de commande.Félicitations, vous venez de recevoir le UUoCA
Est-il vraiment inutile si elle augmente la lisibilité? J'ai trouver quelque chose comme
(while read i; do whatever; done) < file-list.txt
à être "à l'envers" à lire. Aussi, les changements de contexte et de chargement de lacat
binaires sont très bon marché, puisque l'on ne remarque pas la différence sur le matériel actuel.est peut-être un trop grand mot ici, mais je dirais que l'approche dans votre commentaire est supérieure à la le
cat ... |
approche. Et depuis *NIX est un très bel OS, vous ne voulez pas étais processus, pensez-vous? 😉OriginalL'auteur asveikau
BASH entrée de la FAQ #1: "Comment puis-je lire un fichier (flux de données, variable), ligne par ligne (et/ou d'un champ par champ)?"
Si le nom de fichier restera le même, alors que le deuxième argument de
mv
peut être juste le répertoire.OriginalL'auteur Ignacio Vazquez-Abrams
répertoire du script doit être la votre emplacement des fichiers
Vous manque un
$(cat $TO_B)
?à l'aide de
for i in $(cat $TO_B)
ne sera pas de gérer correctement les noms de fichiers avec des espaces. C'est une des raisons que je préfère ma réponse,cat filename | while read i
.OriginalL'auteur Vijay
vous pouvez déplacer 1000 ou 1000 répertoire de l'utilisateur sans prendre beaucoup de temps, où des milliers de répertoire de l'utilisateur existe.
OriginalL'auteur Laxman Singh
Vous devez utiliser BASH? Qu'en Perl ou Kornshell? Le problème ici est que Bash n'a pas de hachage à clé tableaux (Kornshell et Perl). Cela signifie que il n'y a pas de moyen simple de suivre ce que les fichiers d'aller où. Imaginez en Perl:
Les lignes ci-dessus créer deux tables de hachage. L'un pour les fichiers qui doivent être déplacés vers le Répertoire B et un pour les fichiers qui doivent être déplacés vers le Répertoire C. Maintenant, tout ce que j'ai à faire est de regarder mon hachage et de décider:
Mon si les déclarations pouvez maintenant regarder pour voir si une touche a été défini dans ce hachage. Si il a, je sais que le fichier peut être déplacé dans le répertoire. Je n'ai qu'à lire les deux fichiers texte une fois. Après cela, mes deux hachages va stocker les fichiers se déplacer d'un répertoire et pour les autres.
Cependant, nous n'avons pas de tables de hachage, nous allons utiliser
grep
pour voir si le nom de fichier est dans le répertoire. Je vais supposer que vous avez un nom de fichier sur chaque ligne.La
grep -q
recherche de vos deux fichiers texte pour voir si le fichier correspondant est là. Si elle l'est, il va déplacer le fichier vers le répertoire. Ce n'est pas très efficace car il a pour rechercher le fichier texte entier à chaque fois. Cependant, il est assez efficace, et vous êtes seulement à parler de 10 000 fichiers, de sorte que l'ensemble de l'opération ne devrait prendre que quelques minutes.OriginalL'auteur David W.
À l'aide de bash, avoir une énorme liste de fichiers contenant des chaînes de caractères avec la tête et/ou de la fermeture des espaces que j'avais proposer:
voir:
OriginalL'auteur anon