2010-04-14 7 views
2

Exécuter un listing récursif de tous les fichiers dans/var/log et rediriger la sortie standard vers un fichier appelé lsout.txt dans votre répertoire personnel. Complétez cette question SANS quitter votre répertoire personnel.bash: liste récursive de tous les problèmes de fichiers

An: ls -R/var/log /> /home/bqiu/lsout.txt

Je compte la commande bash ci-dessus ne sont pas correctes. Parce que j'ai trouvé ce qu'il était magasins:

$ ls -R /var/log 
/var/log: 
empty.txt setup.log setup.log.full tmp 

/var/log/tmp: 
fake.txt subfolder 

/var/log/tmp/subfolder: 

Est-ce que ce problème résolu signifie?

Je ne sais pas.

Parce qu'il contient plus de « choses » que « seuls les fichiers »

Ou du moins, si le but était de trouver tous les « fichiers » sous le «/var/log » répertoire récursive, j'espère obtenir l'anwser comme ceci:

/var/log/empty.txt 
/var/log/setup.log 
/var/log/setup.log.full 
/var/log/tmp/fake.txt 

Alors quelqu'un peut analyser le contenu de la sortie pour une utilisation ultérieure. Un tel comme

$ perl -wnle 'print "$. :" , $_;' logfiles 
1 :/var/log/empty.txt 
2 :/var/log/setup.log 
3 :/var/log/setup.log.full 
4 :/var/log/tmp/fake.txt 

C'est ce que j'ai jusqu'à présent:

$ ls -1R 
.: 
cal.sh 
cokemachine.sh 
dir 
sort 
test.sh 

./dir: 
afile.txt 
file 
subdir 

./dir/subdir: 

$ ls -R | sed s/^.*://g 

cal.sh 
cokemachine.sh 
dir 
sort 
test.sh 


afile.txt 
file 
subdir 

Mais cela laisse encore tous les noms répertoire/sous-répertoire (dir et subdir), plus deux nouvelles lignes vides

Comment puis-je obtenir le bon résultat sans utiliser Perl ou awk? De préférence en utilisant uniquement les commandes bash de base (uniquement parce que Perl et awk sont hors de portée de l'évaluation)

Modifié: Je me suis concentré sur mon propre dossier "$ HOME" juste pour restreindre le fichier listé. J'ai peu de contenu dans mon homedir

Edité le 2: Désolé pour ma question inappropiée dans le formulaire initial. J'ai corrigé le libellé et j'espère que tout le monde pourra voir le problème maintenant.

+0

La question n'est pas claire - qu'est-ce qui est * correct? Est-ce que chaque ligne de la sortie finale devrait être de la forme './Dir/afile.txt'? Noms de base uniquement? –

+0

Avez-vous essayé la commande 'find'? –

+1

La principale erreur de la réponse fournie est que le fichier de sortie doit être '$ HOME/lsout.txt'; La plupart des gens ne sont pas dans/home/bqiu. La principale erreur avec ce que vous faites semble être que vous ignorez la demande de liste du contenu de/var/log. –

Répondre

4

Essayez -

find/var/log> ~/lsout.txt

+0

Ne pensez pas que c'est ce que l'on voulait dire. De plus, comment pouvez-vous garantir que votre implémentation 'find' ne quitte pas le répertoire personnel? – vladr

+2

@Vlad: Je laisserais l'op décider quel pipit était désiré. En ce qui concerne la commande de recherche "quitter. Le répertoire de base - Je n'ai aucune idée de ce dont vous parlez." Merci de nous donner votre code – chetan

4

Si vous avez reçu aucune restriction en termes dont les commandes peuvent ou ne peuvent pas être utilisés, ls -R /var/log >~/lsout.txt ou find /var/log -print >"$HOME/lsout.txt" ou tout combinaison similaire fonctionnera très bien.

Cependant, si le point de la mission est d'écrire un 100% sh mise en œuvre à base, sans utiliser ls -R, find, etc.alors vous devriez produire quelque chose le long des lignes de:

#!/bin/sh 

# Helper method which recursively lists the contents of a given directory 
# Usage: recurse_ls target_directory 
recurse_ls() 
{ 
    TARGET_DIR="$1" 
    # list contents of $TARGET_DIR 
    ... 
    # - recursive call to list contents of sub-directories 
    recurse_ls ... 
    ... 
} 



# MAIN 
# Usage: script.sh target_directory 
# - check that parameters to script.sh are correct 
... 
# - list the contents of target_dir and its subdirectories 
recurse_ls "$1" 

Liens utiles:

+0

@Vlad Romascanu: Merci pour cet exemple de code squelette. Je pense que la réponse "proposée" dans le passé n'était pas tout à fait correcte –

+0

@Vlad Romascanu: encore une fois, merci pour les liens de référence! –

1

Je suppose que la réponse qu'ils veulent est: ls -R /var/log/ > /home/bqiu/lsout.txt
ie. la réponse originale que vous avez dite était fausse. Sauf indication contraire: ls -R /var/log/ > ~/lsout.txt.
De cette façon, il sort dans le répertoire personnel de celui qui est connecté, plutôt que simplement utilisateur "bqiu".

Quand il dit: Run a recursive listing of all the files
Pour moi ls est synonyme de listing et l'option -R est synonyme de recursive.
Donc, pour moi, le libellé de la question suggère d'utiliser ls -R pour produire la liste,

Mais cela dépend du format qu'ils veulent la liste.

Questions connexes