Je veux trouver tous les fichiers par longueur des noms de fichiers.
Par exemple , si je veux trouver des fichiers de longueur 1, tels que a.go
, b.go
.
Je mets:
grep '.\{1\}' file
Mais cela ne fonctionne pas. Quelle commande puis-je utiliser pour rechercher des fichiers par longueur de nom de fichier?
a.go
est un nom de fichier de longueur 4.a
est un nom de fichier de longueur 1. C'est Unix, pas DOS où le nom et l'extension étaient séparés et un implicite.
faisait toujours partie du nom de fichier.Réponses:
grep
recherche des modèles dans le contenu des fichiers. Si vous voulez regarder les noms des fichiers, vous pouvez simplement utiliser un glob de shell (si vous ne voulez considérer que les noms de fichiers dans le répertoire courant):(Au fait, c'est le shell qui évalue le glob, pas la
echo
commande.)Si vous souhaitez rechercher récursivement dans les répertoires, en commençant par le répertoire courant, l'outil à utiliser est
find
:(Notez que vous devez citer le modèle pour empêcher le shell de l'évaluer en tant que glob avant d'
find
être invoqué.)la source
Si vous souhaitez simplement trouver les noms de fichiers, vous pouvez utiliser la commande suivante:
Cela s'exécutera
find
, extraira le nom du fichier ou du répertoire à l'aide debasename
, puis recherchera tout nom de fichier ou nom de répertoire d'au moins 100 caractères. Si vous souhaitez trouver un nom de fichier d'une longueur exacte, utilisez{100}
plutôt que{100,}
.Si vous souhaitez trouver les noms de fichiers, y compris le chemin, procédez comme suit:
Cela renverra le nom de fichier, y compris le chemin d'accès relatif à l'emplacement où vous avez exécuté la commande find.
la source
Tout d'abord,
grep
recherche dans le contenu des fichiers, il ne recherchera pas les noms de fichiers. Pour ça tu veuxfind
. Il n'a pas d'option pour définir la longueur du nom de fichier mais vous pouvez analyser sa sortie pour obtenir ce que vous voulez. Voici quelques exemples que j'exécute dans un répertoire contenant les fichiers suivants:La recherche de fichiers dans ce répertoire renvoie:
Donc, pour trouver les fichiers d'une longueur de X, nous devrons supprimer le chemin et ne faire correspondre que les caractères après le dernier
/
:La
sed
commande supprime simplement le./
. Le-P
drapeau active les expressions régulières compatibles Perl qui sont nécessaires,{n}
ce qui est une chose PCRE et les$
moyens "correspondent à la fin de la chaîne".Vous pouvez également simplement faire ceci:
C'est bien pour les petits nombres taper 15 points pour correspondre aux noms de fichiers de longueur 15 n'est pas très efficace.
Enfin, si vous souhaitez ignorer l'extension et ne faire correspondre que le nom du fichier, faites-le (comme l'a suggéré @slm):
Cependant, cela trouvera également des fichiers comme
a.bo.go
. C'est mieux si vos noms de fichiers peuvent en contenir plusieurs.
:REMARQUE: La solution ci-dessus suppose que vous avez des noms de fichiers relativement sains qui ne contiennent pas de nouveaux caractères de ligne, etc. Si l'un de ces problèmes pose problème, faites-le moi savoir et je mettrai à jour ma réponse.
la source
Vous ne spécifiez pas, mais si les fichiers se trouvent dans une structure de répertoires, vous pouvez utiliser
find
pour localiser les fichiers de longueur 1, à l'aide degrep
:Exemple
la source
ggrep
: heystephenwood.com/2013/09/install-gnu-grep-on-mac-osx.html . Sachez également que ce Q n'a pas été marqué comme OSX, donc l'utilisation degrep
est appropriée.J'utiliserais quelque chose comme ça.
Donc, si vous mettez deux "?" alors vous recherchez des noms de fichier avec deux caractères et l'extension.
la source
Lorsque vous souhaitez utiliser une expression régulière dans la commande find, vous devez utiliser
""
par exemple:pour votre cas d'utilisation:
Vous devez remplacer votre chemin réel avec YourPath, des
-a
moyensAnd
-type f
signifie que vous êtes à la recherche uniquement pour les fichiers réguliers.?
dans votre requête signifie un caractère tel que DOS si vous vous en souvenez.la source
ls ?.*
devrait vous donner les résultats souhaités.la source