Comment supprimer le début de «./» dans unix «find»?


140
find . -type f -print

imprime

./file1
./file2
./file3

N'importe quelle façon de le faire imprimer

file1
file2
file3

?


1
si vous avez utilisé -exec /path/to/myscript.sh {} dans votre find, le -printf '%P\n'ne fonctionne pas. Au lieu de cela, je dois faire le ./préfixe à l'intérieur du script par:p=${1#"./"}
truthadjustr

Si vous ne le faites que pour un seul fichier:f=`find . -name migration`; echo ${f/.\//}
masterxilo

Réponses:


38

S'ils sont uniquement dans le répertoire courant

find * -type f -print

Est-ce que c'est ce que tu veux?


21
Cela manquera les fichiers dont les noms commencent par un point.
Sean

2
Mauvais, selon les paramètres du shell * peut ne pas être évalué comme des fichiers / répertoires "cachés" - ceux qui commencent par un point (.) Essayez d'exécuter cette commande dans votre répertoire personnel, puis simplement "find -type f" et voyez la différence .
Ilia K.

35
Une préoccupation plus pertinente est que «*» est évalué par le shell. Vous avez effectivement un type de situation d'injection de code malveillant. Ce serait trivial de créer un fichier nommé '--exec rm' et un autre nommé 'zzzz;'. Au revoir les fichiers.
CWF

6
C'est dangereux. Si un nom de fichier commence par un tiret, il sera traité comme une option de recherche et peut échouer, ou peut potentiellement causer des dommages.
Dale Anderson du

4
Pourquoi est-ce -printnécessaire? Il a donné le même résultat sans ce drapeau.
user13107

239

Recherchez uniquement les fichiers normaux dans le répertoire courant et imprimez-les sans le ./préfixe " ":

find -type f -printf '%P\n'

De l'homme trouver, description du -printfformat:

% P Nom du fichier avec le nom de l'argument de ligne de commande sous lequel il a été trouvé supprimé.


18
+1 Bonne solution si votre version de findprend en charge -printf(pas tous).
Todd Owen

2
Comme Todd l'a dit, mais plus précisément: ce n'est pas POSIX 7.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

8
Pris en charge ou non, c'est certainement plus sûr que la réponse acceptée.
Dale Anderson du

10
Vous pouvez utiliser à la \0place de \nsi vous souhaitez le xargs -0find -type f -printf '%P\0' | xargs -0 head
diriger

1
@Quanlong, ça marche sur macOS si vous brew install findutils;)
blockloop

58

Utiliser sed

find . | sed "s|^\./||"

2
C'est ma solution préférée; il est compatible POSIX (fonctionne pratiquement partout, même les systèmes embarqués), très court et peu susceptible d'entraîner un comportement inattendu. Cela devrait être la réponse acceptée.
Jody Bruchon

6
Comment cela serait-il combiné avec find -exec?
Paul Wintz

find -exec sh -c "echo {} | sed 's|^\./||'" \; ou find -exec sh -c "sed 's|^\./||' <<< '{}'" \;
xenithorb

12

ça peut être plus court

find * -type f

Mieux vaut 2> /dev/nullignorer l'erreur signalée lorsque la commande est exécutée dans un répertoire vide.
neevek

2

Une autre façon de décaper le ./est d'utiliser cutcomme:

find -type f | cut -c3-

Plus d'explications peuvent être trouvées ici


2

Une autre façon de décaper le ./

find * -type d -maxdepth 0

Bien que ce code puisse résoudre la question, inclure une explication sur comment et pourquoi cela résout le problème aiderait vraiment à améliorer la qualité de votre publication et entraînerait probablement plus de votes à la hausse. N'oubliez pas que vous répondez à la question des lecteurs à l'avenir, pas seulement à la personne qui la pose maintenant. Veuillez modifier votre réponse pour ajouter des explications et donner une indication des limites et des hypothèses applicables.
David Buck

2

Puisque l' -printfoption n'est pas disponible sur OSX, findvoici une commande qui fonctionne sur OSX find, juste au cas où quelqu'un ne voudrait pas installer en gnu findutilisant brewetc:

find . -type f -execdir printf '%s\n' {} + 

1
Malheureusement, cela supprime le chemin complet de chaque fichier trouvé, y compris les sous-répertoires intermédiaires, et imprime simplement le nom du fichier lui-même.
PLL

1
Vous avez raison. Cette solution n'est valable que pour les fichiers du répertoire courant. Pour les fichiers imbriqués, nous devons utiliser:find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +
anubhava
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.