Сценарий оболочки: проверьте, что файл является файлом, а не каталогом - PullRequest
1 голос
/ 26 января 2011

В настоящее время я работаю над небольшим симпатичным сценарием оболочки, который перебирает определенную папку и выводит только файлы внутри нее, исключая любые возможные каталоги.К сожалению, я не могу использовать find, так как мне нужен доступ к переменным имени файла.

Вот мой текущий фрагмент, который не работает:

for filename in "/var/myfolder/*"
do
  if [ -f "$filename" ]; then
    echo $filename # Is file!
  fi

done;

Что я делаю неправильно?

Ответы [ 5 ]

4 голосов
/ 26 января 2011

Вы не должны экранировать / var / myfolder / *, то есть вы должны удалить двойные кавычки, чтобы оболочка правильно расширила выражение до нужного списка имен файлов.

2 голосов
/ 26 января 2011

То, что вы делаете неправильно, не использует find.Имя файла можно получить с помощью {}.

find /var/myfolder -maxdepth 1 -type f -exec echo {} \;
1 голос
/ 26 января 2011

for filename in "/var/myfolder/*"

Кавычки означают, что вы получаете одну гигантскую строку из этого шарика - вставьте echo _ $filename _ непосредственно перед if, чтобы обнаружить, что она проходит через «цикл» только один раз, с чем-то бесполезным.

Удалите цитаты и попробуйте снова:)

1 голос
/ 26 января 2011

Попробуйте без двойных кавычек вокруг / var / myfolder / * (причина в том, что, помещая двойные кавычки, вы делаете все файлы одной строкой, а каждое имя файла не отдельной строкой

0 голосов
/ 26 января 2011

Вы можете найти и избежать всех этих неприятностей.

for i in $(find /var/myfolder -type f)
do
echo $(basename $i)
done

Разве это не то, что вы пытаетесь сделать со своей ситуацией? Если вы хотите ограничить глубину, используйте параметр -maxdepth, чтобы найти.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...