C'est une question sérieuse. Je teste certains awk
scripts et j'ai besoin de fichiers avec une nouvelle ligne dans leurs noms.
Est-il possible d'ajouter une nouvelle ligne dans un nom de fichier avec mv
?
Maintenant, je peux le faire avec touch
:
touch "foo
bar"
Avec le toucher, j'ai ajouté le caractère de nouvelle ligne par copier-coller. Mais je ne peux pas écrire foo
Returnbar
dans ma coquille.
Comment renommer un fichier pour avoir une nouvelle ligne dans le nom de fichier?
Edit 2015/06/28; 19 h 08
Pour ajouter une nouvelle ligne dans zsh
Je peux utiliser, Alt+Return
mv
serait différent de le faire avectouch
? As-tu essayé la même chose?mv
commande aussi facilement quetouch
.Réponses:
C'est une mauvaise idée (d'avoir des caractères étranges dans les noms de fichiers) mais vous pourriez faire
(vous auriez aussi pu faire
mv somefile.txt "$(printf "foo\nbar")"
oumv somefile.txt foo$'\n'bar
, etc ... les détails sont spécifiques à votre shell. J'utilisezsh
)En savoir plus sur le globbing , par exemple glob (7) . Les détails peuvent être spécifiques au shell. Mais comprenez que cela
/bin/mv
est donné (par votre shell), via execve (2) , un tableau étendu d'arguments: l'expansion des arguments et la globalisation sont la responsabilité du shell appelant.Et vous pouvez même coder un petit programme C pour faire de même:
Enregistrez le programme ci-dessus
foo.c
, compilez-le avecgcc -Wall foo.c -o foo
puis exécutez./foo
De même, vous pouvez coder un script similaire en Perl, Ruby, Python, Ocaml, etc ....
Mais c'est une mauvaise idée. Évitez les sauts de ligne dans les noms de fichiers (cela déroutera l'utilisateur et pourrait casser de nombreux scripts).
En fait, je recommande même de n'utiliser que des lettres, des chiffres et des
+-/._%
caractères non accentués (en/
étant le séparateur de répertoire) dans les chemins de fichiers. Les fichiers "cachés" (commençant par.
) doivent être utilisés avec prudence et parcimonie. Je pense que l'utilisation de tout type d'espace dans un nom de fichier est une erreur. Utilisez un trait de soulignement à la place (par exemplefoo/bar_bee1.txt
) ou un moins (par exemplefoo/bar-bee1.txt
)la source
foo
.@
et,
serait plus inoffensif que-
(comme en première position) ou%
. Toutes ces recommandations visent principalement à contourner les bogues dans certaines applications (qui se cassent sur des noms de fichiers qui sont par ailleurs valides du point de vue du système d'exploitation). Il est rétrograde de demander aux gens de ne pas utiliser ces personnages plutôt que de corriger leurs bugs.Si vous utilisez bash, cette commande devrait fonctionner.
la source
zsh
aussi =)Je sais que vous avez demandé une
mv
solution, cependant, malgré l'avertissement, cela peut être facilement fait avecrename
(dans le paquet Perl):la source
rename
, une très bonne idée. +1Un aspect de ce problème ne concerne pas vraiment
awk
- et seulement un peu sur le shell. Le problème est que sur un tty standard et canonique la plupart du temps, la discipline tty du noyau met en mémoire tampon vos entrées - en les faisant simplement écho sur votre écran et nulle part ailleurs - afin qu'il puisse gérer efficacement le retour en arrière et autres.Cependant, lorsque vous appuyez sur Entrée ou entrez une nouvelle ligne, toutes ces données mises en mémoire tampon sont envoyées en même temps à l'application de lecture - généralement votre shell. Vous pouvez observer cela en surveillant
$PS2
après avoir entré un devis pendant. Lorsque le shell s'imprime,$PS2
c'est parce qu'il vient de lire un bloc de votre entrée et n'est pas encore convaincu que vous avez terminé.Donc, pour plus de commodité, ce dont vous avez besoin est un moyen d'envoyer une ligne
\n
électronique dans le tampon du terminal sans avoir à pousser immédiatement toutes ces autres entrées. La façon standard de le faire est avec la séquence de touchesCTRL+V
- qui cite pour le terminal votre prochain caractère d'entrée. FaitesCTRL+V
ensuiteCTRL+J
- parce que ce dernier est généralement la façon de taper une ligne\n
électronique littérale . Vous saurez que cela fonctionne lorsque vous ne voyez pas,$PS2
car le shell n'a toujours pas lu votre entrée.Notez bien que quand il ne lire que votre entrée plus tôt
CTRL+V
aura fait aucune différence pour la coquille du tout - qu'il ne cite que pour la ligne-discipline. Vous voudrez certainement citer la nouvelle ligne pour citer quelque chose de significatif.Soit dit en passant,
CTRL+V
peut être utilement appliqué par d'autres moyens - par exemple, ce"$(printf \\33)"
n'est pas le seul moyen d'écrire unESC
caractère dans un script shell - et ce n'est même pas le plus simple. Vous pouvez littéralement entrer n'importe quel caractère que votre clavier enverra sans que le pilote d'entrée ne tente de l'interpréter si vous y échappez tout d'abord de cette manière.J'aime souvent utiliser des <tab> s sur la ligne de commande sans que le shell essaie de terminer quoi que ce soit. Parce que les shells qui effectuent la complétion configurent généralement <tab> de manière synonyme de
stty eol \t
, pour que leurs systèmes de complétion fonctionnent, celaCTRL+V
fonctionne pour moi même dans des environnements inconnus.la source