Si j'ai un répertoire contenant des fichiers dont les noms ont des espaces, par exemple
$ ls -1 dir1
file 1
file 2
file 3
Je peux tous les copier avec succès dans un autre répertoire comme celui-ci:
$ find dir1 -mindepth 1 -exec cp -t dir2 {} +
Cependant, la sortie de find dir1 -mindepth 1
contient des espaces non échappés:
$ find dir1 mindepth 1
dir1/file 1
dir1/file 3
dir1/file 3
Si j'utilise à la print0
place de print
, la sortie contient toujours des espaces non échappés:
$ find dir1 mindepth 1 -print0
dir1/file 1dir1/file 2dir1/file 3
Pour copier ces fichiers manuellement en utilisant cp
, j'aurais besoin d'échapper aux espaces; mais il semble que ce ne soit pas nécessaire quand cp
les aguments proviennent find
, que j'utilise +
ou \;
à la fin de la commande.
Quelle en est la raison?
find..exec
peut gérer des noms de fichiers étranges par lui-même ..La question est en deux parties:
find
gérer les programmes d'appel à l' aide-exec
sans se heurter à des problèmes avec des espaces intégrés dans les noms de fichiers, et-print0
option?Pour le premier,
find
effectue un appel système, en fait l'un d'un groupe d'appels connexes appelé "exec" . Il transmet le nom de fichier en tant qu'argument directement à cet appel, qui est ensuite transmis directement (après la création d'un nouveau processus) sans perdre d'informations sur le nom de fichier.La
find
fonction POSIX+
est expliquée comme suit, dans la justification :Que " notamment un
-print0
primaire" se réfère à GNUfind
etxargs
qui résout le problème d'une manière différente. Il est également supporté par FreeBSDfind
etxargs
. Si vous avez ajouté une-0
option (voir la page de manuel ) à l'xargs
appel, alors ce programme accepte les lignes terminées par des caractères "null byte". À son tour,xargs
appelle les fonctions exec pour faire son travail. La principale distinction entre la fonctionnalité-print0
et-0
et la+
fonctionnalité est que la première transmet les noms de fichiers sur un tuyau, tandis que la seconde ne le fait pas. Les développeurs trouvent des utilisations pour presque toutes les fonctionnalités; les tuyaux ne font pas exception.Revenons à l'exemple de OP, qui utilise une
-t
option pourcp
: qui ne se trouve pas dans POSIX cp . Il s'agit plutôt d'une extension (alias "fonctionnalité non standard") fournie par GNU cp . L'-0
extension dexargs
n'améliorerait pas cet exemple, mais il y a d'autres cas où il peut être utilisé efficacement - en gardant à l'esprit qu'il existe une alternative portable+
, que GNUfind
accepte.la source
( Cela devrait être un commentaire mais il est trop grand. )
Pour ceux qui aiment essayer les choses:
Créez un script répertoriant les paramètres positionnels transmis, appelez-le
list_positional_parameters.sh
.Exécutez-
find
le sur un répertoire $ dir:Comme prévu, il n'y a qu'un seul paramètre dans tous les appels, le nom de fichier, qu'il y ait ou non des espaces dans son nom.
la source
printf
commeprintf '"%s"\n' "$@"
pour imprimer tous les arguments positionnels cités, pour une inspection visuelle.