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}'