En général, la chaîne vide ne désigne pas le répertoire courant, ni pour les commandes shell ni dans les appels système. C'était le cas sur certains systèmes plus anciens, mais pas sur les systèmes compatibles POSIX .
Parfois, vous trouverez un programme qui utilise le répertoire actuel lorsque vous passez une chaîne vide et que le programme attend un nom de répertoire. Cela est parfois délibéré, et parfois un effet secondaire de l'ajout du chemin absolu du répertoire actuel lorsque la chaîne donnée ne commence pas par une barre oblique.
La meilleure chose pour vous serait de quitter le ./
. Cela ne fait aucun mal.
Si la liste des fichiers est pour
find . … | sed 's!^\./!!'
Notez que cela modifie certains noms de fichiers contenant des retours à la ligne. Ce n'est généralement pas un problème pour la consommation humaine, et la sortie de find
ne convient pas à la consommation de programme car elle est ambiguë. Si vous utilisez -print0
, ce qui convient à la consommation du programme, vous ne vous souciez probablement pas du ./
préfixe de toute façon.
Vous pouvez utiliser à la find * …
place de find . …
, mais notez qu'il find *
présente un certain nombre de défauts qui le rendent généralement inapproprié:
.
est omis.
- Tous les fichiers de points (fichiers dont le nom commence par
.
ou ..`) sont omis.
- S'il y a un nom de fichier dans le répertoire courant dont le nom commence par
-
(ou un fichier appelé !
ou (
...), il sera interprété comme une option ou un prédicat par find
.
Le premier point n'a pas d'importance si votre filtre exclut le répertoire actuel. Pour le deuxième point, vous pouvez utiliser les modèles ..?* .[!.]* *
pour faire correspondre tous les fichiers du répertoire en cours, mais vous devrez vérifier si chaque modèle correspond à au moins un fichier et l'omettre s'il ne le fait pas. C'est possible mais très lourd. Le dernier point est un bouchon. Cela find *
peut donc convenir à une utilisation en ligne de commande rapide, mais ne l'utilisez pas dans un script.
Une autre approche consiste à utiliser la fonction de globulation récursive du shell, par exemple
printf '%s\n' **/*.h
Cela doit être activé par shopt -s globstar
dans bash et par set -o globstar
dans ksh93, et n'existe pas dans un shell POSIX de base tel que dash. Les fichiers de points ne seront pas traversés par défaut; pour les inclure, assurez-vous d'abord de ne pas ignorer les fichiers dot avec shopt -s dotglob
en bash ou FIGNORE='@(.|..)'
en ksh93. De plus, s'il n'y a pas de correspondance, cette commande imprime le motif; exécutez shopt -s nullglob
en bash pour imprimer une ligne vide à la place et utilisez le modèle ~(N)**/*.h
dans ksh.
Dans zsh, la globalisation récursive est activée par défaut. Utilisez le qualificatif glob D
pour inclure des fichiers de points et N
pour imprimer une ligne vide s'il n'y a pas de correspondance (par défaut, zsh renvoie une erreur si un motif ne correspond à aucun fichier). Vous pouvez utiliser printf
comme ci-dessus ou
print -rl -- **/*.h(DN)
find
a le paramètre -printf pour manipuler la façon dont les résultats sont affichés.find . -name '*.h' -printf '%P\n'
supprimera le./
préfixe. Voyez ce quefind . -name '*.h' -print
ça fait.