2 votes

Comment puis-je trouver tous les fichiers d'un type spécifique dans RHEL sur la ligne de commande ?

Je recherche des fichiers de type .flv , .avi など

Je voudrais voir une liste de tous les fichiers (sur mon serveur) de ces types de fichiers (cela ne me dérange pas de le faire un par un, c'est-à-dire de voir tous les fichiers de type .flv alors tous les fichiers de .avi ).

Ensuite, une fois que j'ai identifié ceux que je veux déplacer, comment puis-je copier plusieurs fichiers éparpillés dans le système de fichiers vers un dossier spécifique ?

3voto

raphink Points 10967

Il existe plusieurs façons de rechercher des fichiers sur les systèmes GNU/Linux. Les deux principales sont locate y find :

  • locate utilise une base de données de fichiers connus dans l'ensemble du système pour trouver des documents. Il est très utile mais nécessite de maintenir cette base de données à jour (avec updatedb ), ce qui peut prendre beaucoup de temps ;
  • find recherche les fichiers dans un répertoire donné. Il est généralement plus lent que locate (il n'a pas de base de données persistante) mais il est plus fin.

Ainsi, si vous avez besoin de trouver tous les fichiers sur votre système qui correspondent à vos critères, vous pouvez utiliser locate :

$ locate --regex "avi|flv" | grep '\.\(avi\|flv\)$'

alors que si vous effectuez une recherche dans un répertoire spécifique et que vous voulez être sûr de ne pas avoir d'effet de retard de cache, vous pouvez utiliser find :

$ find /path/to/your/directory -regex '.*\.\(avi\|flv\)'

Maintenant, pour copier ces fichiers dans un dossier spécifique :

$ locate --regex "avi|flv" | grep '\.\(avi\|flv\)$' | xargs cp /path/to/specific/folder

ou

$ find /path/to/your/directory -regex '.*\.\(avi\|flv\)' -exec cp {} /path/to/specific/folder \;

0 votes

Je suis en train d'exécuter updatedb et le curseur ne fait que clignoter. Comment puis-je savoir quand c'est terminé ? Dois-je ouvrir une nouvelle fenêtre de terminal et faire autre chose ? La dernière fois que j'ai tenté une opération importante, le curseur est resté clignotant à l'infini - jusqu'à ce que je quitte l'application après environ 6 heures, j'étais alors presque certain que l'opération était terminée. Y a-t-il un autre moyen de le savoir ?

0 votes

L'un des principes fondamentaux des commandes Unix est qu'elles n'émettent rien à moins que cela ne soit nécessaire. Il est donc normal qu'une commande reste clignotante pendant qu'elle travaille, à moins qu'elle ne fonctionne en mode verbeux. Vous pouvez utiliser la commande --verbose pour udpatedb si vous voulez voir tout ce qu'il fait, mais attention, cela rendra le processus encore plus long, car l'impression de tous les fichiers limitera la vitesse de traitement.

0 votes

Ahh...merci.... ça ne me dérange pas, au moins je saurai quand c'est fait plutôt que quand ça ne l'est pas.

1voto

Paweł Brodacki Points 6411

En développant le commentaire de Raphnik, vous pouvez vous épargner un pipe à travers grep en mettant dans la partie regex des commandes locate ou find : '\.avi$|\.flv$' -- Il correspondra aux fichiers portant l'extension .avi et .flv.

0 votes

Ah, merci. J'avais essayé quelque chose comme \.(avi|flv)$ sans succès ;-)

0voto

user44359 Points 21

Il y a probablement des moyens plus élégants de faire cela avec find -exec ou xargs mais voici un hack rapide :

updatedb 

puis

for fred in `locate *.flv | awk ' { print $1 } '` do;
mv "$fred" /my/dest/folder/
done

(etc)

0 votes

Pardonnez ma question idiote, mais est-ce que tout ce code ? comme dans... for fred ? Cela me semble un peu étrange, mais je suis complètement novice en matière de Linux, donc je pourrais mal comprendre. Ou suis-je censé substituer quelque chose d'autre à fred ?

0 votes

locate ne produit que des noms de fichiers, donc je ne vois pas l'intérêt de l'option awk tuyau. Aussi, for coupe sur les espaces, donc les fichiers avec des espaces échoueront avec cette boucle. De plus, tout cela pourrait être fait avec xargs au lieu d'une boucle, d'autant plus que mv peut supporter plus de 2 arguments sans problème. Ensuite, la question n'était pas de déplacer les fichiers mais à copie les. L'utilisation de cette commande entraînera la perte des fichiers originaux. Enfin, locate ne correspond pas à ensemble du site sauf si vous le spécifiez, donc *.flv n'est pas une bonne correspondance.

0 votes

@marc.gayle : for fred in ... définit une boucle avec une variable fred qui est ensuite utilisé comme $fred à l'intérieur de la boucle.

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