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/.\//}
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é.
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|^\./||' <<< '{}'" \;
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:
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' {} +
-exec /path/to/myscript.sh {}
dans votrefind
, 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#"./"}
f=`find . -name migration`; echo ${f/.\//}
Réponses:
S'ils sont uniquement dans le répertoire courant
find * -type f -print
Est-ce que c'est ce que tu veux?
la source
-print
nécessaire? Il a donné le même résultat sans ce drapeau.Recherchez uniquement les fichiers normaux dans le répertoire courant et imprimez-les sans le
./
préfixe " ":De l'homme trouver, description du
-printf
format:la source
find
prend en charge-printf
(pas tous).\0
place de\n
si vous souhaitez lexargs -0
find -type f -printf '%P\0' | xargs -0 head
brew install findutils
;)Utiliser sed
la source
find -exec
?find -exec sh -c "echo {} | sed 's|^\./||'" \;
oufind -exec sh -c "sed 's|^\./||' <<< '{}'" \;
ça peut être plus court
la source
2> /dev/null
ignorer l'erreur signalée lorsque la commande est exécutée dans un répertoire vide.Une autre façon de décaper le
./
est d'utilisercut
comme:Plus d'explications peuvent être trouvées ici
la source
Une autre façon de décaper le ./
la source
Puisque l'
-printf
option n'est pas disponible sur OSX,find
voici une commande qui fonctionne sur OSX find, juste au cas où quelqu'un ne voudrait pas installer engnu find
utilisantbrew
etc:la source
find . -type f -exec bash -c 'for f; do echo "${f#./}"; done' {} +