#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 $*