web-dev-qa-db-fra.com

Obtenir le nom du fichier en hexadécimal ou en base64

En raison de ne question sur les recommandations logicielles , je pensais pouvoir implémenter un programme qui analyse la sortie de ls -l et affiche les fichiers dans un style similaire à celui de l'explorateur. Cette approche était suggérée sur ServerFault . Dans le même temps, d'autres personnes découragent d'analyser ls .

Je me demande donc s’il existe un moyen de répertorier le nom du fichier au format hexadécimal ou base64 qui éviterait les caractères spéciaux tels que \n et similaires.

3
Thomas Weller

Je suppose que vous voulez afficher les noms de fichiers à côté de leur valeur hexadécimale. Dans ce cas, voici une simple ligne de code pour démontrer que cela est possible:

$ touch abc 'd e f' 
$ find . -maxdepth 1 -type f -exec sh -c 'printf "%-10s %s\n" "$1" "$(printf "$1" | xxd -pu )"' None {} \;
./abc      2e2f616263
./d e f    2e2f6420652066

L'idée est que pour chaque fichier, nous exécutons printf avec une chaîne de format et deux arguments. Le premier argument est le nom du fichier et le second est le nom du fichier converti en hexadécimal avec l'utilitaire xxd.

La personnalisation ultérieure de la sortie est laissée comme un exercice pour le lecteur.

3
John1024

Eh bien, appelez-moi un noob, mais j'ai essayé la suggestion de John1024 et cela m'a donné une erreur, alors j'ai essayé de le résoudre moi-même. J'ai créé un fichier nommé readline.sh contenant les éléments suivants:

#!/bin/bash

file=$1      # $1 contains the argument passed
> line.txt   # create/empty line.txt
IFS=$'\n'    # set Internal Field Separator to '\n'
for line in `cat $file`       # assign each line in $file to $line
do
    echo $line >> line.txt    # print $line to line.txt

    # this one's tricky because you need to pipe just the line
    # (without a '\n') into xxd and then print it to line.txt
    echo `printf "%s" "$line" | xxd -p` >> line.txt
done
cat line.txt     # we want to see the contents of line.txt now

Maintenant, pour l’exécuter, j’ai appelé ls | ./readline.sh et l’affiche comme suit:

bar
626172
baz
62617a
foo
666f6f
line.txt
6c696e652e747874
readline.sh
726561646c696e652e7368

Maintenant, je tiens à souligner que ce script n’a aucun moyen de vérifier que 1 $ existe, et il a probablement d’autres problèmes, mais, si je comprends bien votre question, il semble que la solution consiste essentiellement à canaliser la sortie de ls ligne par ligne dans xxd -p. Tous les détails supplémentaires étaient a) pour que je puisse m'assurer que cela fonctionnait avant de les poster et b) pour montrer le principe en action.

1
TallChuck