J'essaie d'apprendre les commandes UNIX et je joue à ce jeu pour apprendre et je suis vraiment bloqué en ce moment. Je suis sur un serveur via ssh et le répertoire est plein de fichiers et de dossiers aléatoires et le mot de passe pour le niveau suivant se trouve dans l'un des fichiers. On m'a dit que le fichier présente les avantages suivants:
- lisible par l'homme
- 1033 octets
- non exécutable
Je suppose que je devrais utiliser la find
commande et j'ai essayé find ! -executable
mais cela a renvoyé une charge de fichiers. La seule aide lisible par l'homme que je peux trouver dans le manuel ou en ligne est d'imprimer les tailles de fichier en lisible par l'homme. Alors je suis un peu perdu là-bas?
J'ai aussi essayé find ~ -size 1033b
mais cela n'a rien donné. Mais quand j'ai essayé, find ~ -size -1033b
il a renvoyé tous les fichiers du répertoire.
la source
Réponses:
Pour filtrer les noms de fichiers lisibles par l'homme, vous pouvez utiliser le nom de classe de caractères
[:print:]
( imprimable ) . Vous trouverez plus d'informations sur ces classes dans le manuel de .grep
Dans un second temps, l'exigence "lisible par l'homme" pourrait faire référence au contenu du fichier, au lieu de son nom. En d'autres termes, vous rechercheriez des fichiers texte . C'est un peu plus délicat. Comme @D_Bye l'a suggéré dans un commentaire, vous devez ensuite utiliser la
file
commande pour déterminer le type de contenu du fichier. Mais ce ne serait pas une bonne idée de courirfile
après un pipe, car cela compliquerait la tâche d'afficher le nom du fichier. Voici ce que je suggère:Voici brièvement comment
file
fonctionne -part:-exec
prédicat s'exécutesh -c 'file -b $0 | grep -q text' FILENAME
pour chacunFILENAME
qui remplit toutes les conditions précédentes (type, taille, non exécutable).sh
) exécute ce court scénario :file -b $0 | grep -q text
, en remplaçant$0
le nom de fichier.file
programme détermine le type de contenu de chaque fichier et génère ces informations. L'-b
option empêche l'impression du nom de chaque fichier testé.grep
filtre la sortie provenant dufile
programme, recherchant les lignes contenant du "texte" . (Voyez par vous-même à quoifile
ressemble une sortie typique de la commande.)grep
ne produit pas le texte filtré, car il a l'-q
option (silencieuse) donnée. Ce qu'il fait, c'est simplement changer son état de sortie en0
(ce qui représente "vrai" - le texte filtré a été trouvé) ou 1 (ce qui signifie "erreur" - le texte "texte" n'apparaissait pas dans la sortie defile
).grep
est ensuite transmissh
àfind
et agit comme le résultat final de l'ensemble du "-exec sh -c 'file $0 | grep -q text' {} \;
" test.-print
commande est exécutée (c'est-à-dire que le nom du fichier testé est imprimé).la source
find . -type f -size 1033c
renverra également exactement la même réponse.Notez que j'ai utilisé
c
au lieu deb
pour la taille du fichier.b
est pour des blocs de 512 octets.c
est pour les octets réels.la source
-readable
soit lisible par l'homme (c'est-à-dire non binaire)find
àfile
.tout ce que j'ai écrit était:
et a obtenu le fichier. Apparemment, la partie lisible par l'homme était de vous déconcerter.
la source
la source
Je pense que pour le jeu, la syntaxe correcte est la suivante:
Vous obtenez un retour qui répertorie la composition de chaque fichier. Cela a très bien fonctionné pour ce que vous essayez d'accomplir dans le jeu Bandit. La vraie boule de courbe pour cette tâche est que chaque fichier commence par - (trait d'union).
la source
file ./-*
ceci.Je pense que c'est la meilleure réponse réelle qui couvrirait les 3 conditions
Mais comme beaucoup de gens l'ont dit, l'exécutable et le lisible par l'homme devaient nous décourager, donc en utilisant
c'est bien assez!
la source