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.