J'ai récemment rencontré un fichier dont le nom commence par le caractère «♫». Je voulais copier ce fichier, l'alimenter ffmpeg
et le référencer de diverses autres manières dans le terminal. En général, je complète automatiquement les noms de fichiers étranges, mais cela échoue car je ne peux même pas taper la première lettre.
Je ne veux pas passer à la souris pour effectuer une manœuvre de copier-coller. Je ne veux pas mémoriser un tas de codes pour des scénarios possibles. Ma solution ad hoc était de basculer dans vim
, coller !ls
et copier le caractère en question, puis de le quitter et de le coller dans le terminal. Cela a fonctionné mais est assez horrible.
Existe-t-il un moyen plus simple de gérer de tels scénarios?
REMARQUE: j'utilise la coquille de poisson si elle change les choses.
la source
*restoffile.avi
ou quelque chose comme ça?touch '♫ 漢字カ'
touch '♫ 漢字タ'
Réponses:
Si le premier caractère du nom de fichier est imprimable mais ni alphanumérique ni espace, vous pouvez utiliser l'
[[:punct:]]
opérateur glob:la source
Le plus simple qui me vient
ls [^a-zA-Z0-9]*
à l'esprit est et il fait l'affaire pour moi, mais la réponse de terdon est meilleure en attirant l'attention sur l'option shell extglob ou même une approche indépendante du shell.la source
ls [^[:alnum:]]*
pour la même chose. Mais il vaut mieux utiliser la classe de caractères qu'elle est plutôt que la ou les classes qu'elle n'est pas ; listera doncls [[:punct:]]*
ce fichier.ls a quelques commutateurs (comme --quote-name, --escape, --literal) pour gérer les caractères non imprimables, mais dans ce cas, il semble que le caractère soit "imprimable" mais pas "typable" (du moins sur mon clavier! ), donc aucun de ces commutateurs ne semble aider.
Par conséquent, en tant qu'approche générale de "force brute" pour se débarrasser des fichiers avec des caractères dans leurs noms, vous pouvez faire ceci:
Recherchez la ligne contenant le fichier incriminé. Ce sera probablement la 1ère ligne, mais disons que c'est la 5e. Imprimez la ligne 5 et hexadécimez-la:
En ignorant le caractère 0a (nouvelle ligne), construisez une chaîne d'échappement et utilisez l'option -e d'écho pour traduire les échappements:
Vous pouvez maintenant le copier / déplacer / supprimer comme ceci:
De plus, si vous n'êtes pas limité à l'utilisation d'un script shell, vous pouvez le faire en Python comme ceci:
En utilisant cette approche, vous pouvez traiter de nombreux fichiers, il vous suffit d'écrire la logique de sélection des fichiers appropriés et de les renommer sans vous encombrer, etc.:
la source
Une approche similaire consisterait à répertorier tous les fichiers qui ne commencent pas par des caractères "normaux". En bash, vous pouvez le faire avec
Cependant, cela ne semble pas être disponible
fish
, vous pouvez donc utiliser à lafind
place:la source
Renommer les liens symboliques
Une approche pour gérer les noms de fichiers avec des caractères spéciaux - en tant que premiers caractères ou ailleurs dans le nom de fichier consiste à renommer des noms plus simples .
Cela peut être utilisé même si vous devez conserver les noms de fichiers d'origine : Renommez une copie des noms de fichiers.
Cela peut être fait en copiant les fichiers, mais aussi en créant des liens symboliques ou des liens physiques vers les fichiers et en les renommant.
cp
crée des liens symboliques au lieu de copies avec l'option-s
(-l
pour les liens physiques).Utilisez "detox" pour nettoyer les noms
Pour renommer pour nettoyer les noms de fichiers,
detox
peut être utilisé; Il renomme les fichiers pour nettoyer les noms de fichiers selon diverses règles définies dans undetoxrc
fichier. Par défaut, les caractères UTF8 sont juste supprimés; Avec l'option,-s utf_8-only
ils sont remplacés par_
:"detox" sur les liens symboliques
Combiné avec le travail sur les liens symboliques comme décrit ci-dessus:
la source
Je n'utilise pas
fish
, mais la documentation dit que vous pouvez entrer un caractère Unicode en préfixant son code de caractère hexadécimal avec\u
(pour les caractères 16 bits) ou\U
(pour les caractères 32 bits). Je pense que le code pour♫
est491eb
, donc vous pouvez faire:renommer
♫abc.mp3
.Notez que vous avez besoin des zéros de tête, sinon
abc
à la fin seront traités comme des chiffres hexadécimaux et une partie du code de caractère; pour un caractère 32 bits, vous devez saisir 8 chiffres.la source
Je ne sais pas si c'était déjà le cas en 2014 lorsque vous avez posé la question, mais dans les versions actuelles de
fish
(à partir de 2019), vous pouvez appuyer Tabdeux fois pour obtenir une sélection de style zsh où vous pouvez utiliser les touches fléchées pour sélectionnez visuellement le fichier que vous souhaitez sans avoir à taper une partie du nom de fichier.la source
Le poisson ne prend pas en charge les caractères génériques de support ¹ par conception.
La commande ne recherche pas dans les répertoires cachés et affiche les noms de fichiers qui ne commencent pas avec les personnages
letters
,digits
,.
_
-
(cf la documentationfind
).Remarque:
$argv
est une variable de tableau spéciale (shell de poisson) qui contient les arguments de fonction, par conséquent la commande sous-jacente peut recevoir n'importe quelle expression (par exemple, un alias ).¹ En fait, Fish prend en charge l'expansion des crochets (expansion des variables du tableau) mais Bash utilise une autre terminologie (extensions des paramètres et des noms de fichiers).
la source
Utilisez
zsh
et tapez ce qui vient ensuite. ZSH prend en charge la saisie automatique floue et peut y faire face. (C'est particulièrement agréable avec le plugin OH-MY-ZSH .)la source
Vous n'avez pas dit si vous souhaitez conserver ces noms de fichiers problématiques. Une solution pourrait être de «résoudre» le problème une fois pour toutes en renommant (certains ou tous) vos fichiers en noms que vous pouvez taper en exécutant ce script:
Cela répertoriera vos noms de fichiers existants, chacun suivi de
...?
. Tapez simplement Enterpour laisser un fichier tel quel; ou tapez un nouveau nom pour le renommer. L'-i
option vous demandera de confirmer l'écrasement si vous spécifiez le nom d'un autre fichier existant.Ce script peut être modifié de plusieurs manières:
*
) en quelque chose de plus restrictif, par exemple*.avi *.mov
, afin que vous n'ayez pas à regarder chaque fichier.mv
encp
afin de conserver une copie du fichier avec son nom actuel et de créer une copie (temporaire?) Avec un nom saisissable.Vous pouvez créer un nouveau nom de fichier basé sur le nom de fichier existant. Par exemple,
qui vous permet de gifler un préfixe devant l'ancien nom. Si vous avez choisi un préfixe unique, cela vous permettra d'utiliser la saisie semi-automatique.
la source