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

?

breadjesus
la source
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?

Tim Green
la source
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é.

Ilia K.
la source
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|^\./||"
Mensonge Ryan
la source
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
ghostdog74
la source
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

banjoAtix
la source
2

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

find * -type d -maxdepth 0
Valheru
la source
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' {} + 
anubhava
la source
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