команда file -i не идентифицирует некоторые файлы, переданные функции командой ls

#linux #bash

Вопрос:

Я пытаюсь использовать функцию для печати типа файлов, и если файл является каталогом, он вызовет функцию рекурсивно со списком файлов из каталога.

однако при отправке по ls команде список файлов внутри каталога $(file -i filename) выдает мне «не удается открыть» a1 » (такого файла или каталога нет)», хотя файлы есть, и он получил их из ls.

мой каталог тестирования-это:

 a1 - a directory file, gives (no such file or directory) bunzip2test.txt - a text file, gives (no such file or directory for some reason) dir1.tar.gz - a compressed file, gives the correct info t.txt.gz - a compressed file, gives the correct info zipping.zip - a zip, gives the correct info  

мой код таков:

 #! /bin/bash  function main() {  f=0  printing $@ }  function printing() {    cFile=($@)  echo "printing all files:"  for i in ${cFile[@]}  do  echo $i "and it's type is: $(file -i $i)"  done  if ((f == 0))  then  f=1   printing $(cd testing amp;amp; ls)  fi }  main $*  

выход:

 testing and it's type is: testing: inode/directory; charset=binary printing all files: a1 and it's type is: a1: cannot open `a1' (No such file or directory) bunzip2test.txt and it's type is: bunzip2test.txt: cannot open `bunzip2test.txt' (No such file or directory) dir1.tar.gz and it's type is: dir1.tar.gz: application/gzip; charset=binary t.txt.gz and it's type is: t.txt.gz: application/gzip; charset=binary zipping.zip and it's type is: zipping.zip: application/zip; charset=binary  

запуск cd testing amp;amp; file -i $(ls) с терминала он работает так, как и было предсказано, и правильно идентифицирует все файлы

Ответ №1:

каждый раз , когда вы звоните printing() , вы вызываете/выполняете cd testing … вот почему команда работает только в первый раз, а затем нет.. вытяните функцию cd testing до/вне функции ИЛИ добавьте имя папки в $(file -i $i) качестве $(file -i testing/$i)

Комментарии:

1. для теста я вызвал тот же каталог, вот почему я добавил внутри f=1, чтобы остановить его от бесконечного цикла, я сделал, как вы сказали, и вынул компакт-диск перед вызовом функции, и теперь он работает! (понял это за мгновение до того, как ты сказал мне, но все же я ценю твою помощь!)

2. f всегда будет 0 , так как вы установили его в main .. Я не вижу, как это вам поможет.

Ответ №2:

теперь решите эту проблему, позвонив cd directoryname перед повторным вызовом функции

вот код:

 #! /bin/bash  function main() {  f=0  printing $@ }  function printing() {    cFile=($@)  echo "printing all files:"  for i in ${cFile[@]}  do  echo $i "type is: $(file -i $i)"  done  if ((f == 0))  then  f=1  cd testing  printing $(ls)  fi }  main $*