Saisie du répertoire via le script de base de Unix

Sachez que ce code que je suis sur le sharepoint publier est délibérément pas parfait et ne fonctionnera pas s’il y a un fichier texte dans le répertoire, mais que le code complet a une telle vérification. Mais le problème est que ceci:

#!/bin/bash for d in *; do cd $d done 

produit:

 ./test: line 3: cd: 500: No such file or directory ./test: line 3: cd: 536: No such file or directory ./test: line 3: cd: 560: No such file or directory ./test: line 3: cd: 572: No such file or directory ./test: line 3: cd: out.txt: No such file or directory ./test: line 3: cd: prob1: No such file or directory ./test: line 3: cd: problem2: No such file or directory ./test: line 3: cd: README: No such file or directory ./test: line 3: cd: test: No such file or directory 

où 500, 536, 560 et 572 sont des répertoires qui doivent pouvoir être ouverts. Si je fais juste un CD 500, je peux aller dans le répertoire sans problème. Mais cela ne fonctionnera pas si j’utilise le processus automatisé dans le script shell.

bien alors après avoir continué dans le programme, j’ai maintenant:

 #!/bin/bash cd "$1" for d in */; do ( cd "$d" for file in $*; do ( bla="$(head -4 $file|tail -1)" cd ~cfb43/cs265/a1 echo $bla > out.txt cd cd "$1" cd "$d" ) done cd "$1" ) done 

et je reçois:

 head: error reading `/home/cfb43/cs265/a1': Is a directory head: error reading `/home/cfb43/cs265/a1': Is a directory head: error reading `/home/cfb43/cs265/a1': Is a directory head: error reading `/home/cfb43/cs265/a1': Is a directory head: error reading `/home/cfb43/cs265/a1': Is a directory 

Tout ce que je veux faire, c’est aller dans un répertoire et lire un fichier et obtenir la quasortingème ligne de texte et l’imprimer dans out.txt dans mon dossier. Je ne suis pas sûr pourquoi ce code est bloqué à a1 et pas au moins 500 ou quelque chose comme ça. toute aide supplémentaire et je serais très reconnaissant

Parce que vous essayez d’entrer dans le sous-répertoire suivant sans quitter le précédent. Vous pourriez faire

 #!/bin/bash for d in */; do cd -- "$d" # do some stuff cd .. done 

ou utiliser un sous-shell

 #!/bin/bash for d in */; do ( cd -- "$d" # do some stuff ) done 

êtes-vous sûr de ce que vous faites: $ * qui se transforme en parameters $ 1 $ 2 .. $ {! #}

 for file in $*; do 

peut-être vous voulez: * qui étend aux fichiers dans le répertoire en cours

 for file in *; do 

Une autre façon de faire est de ne jamais changer de répertoire:

 for file in */*;do head -4 "$file" | tail -1 >> ~cfb43/cs265/a1/out.txt done 

et une autre façon de faire

 head -4 | tail -1 

avec sed

 sed n '4{p;q}' 

avec awk

 awk 'NR==4{print;exit}' 

avec perl

 perl -ne 'if($.==4){print;exit}'