Мне нужен мой скрипт, чтобы что-то делать с каждым файлом в текущем каталоге, исключая любые подкаталоги.
Например, в текущем пути есть 5 файлов, но 1 из них является папкой (подкаталогом). Мой скрипт должен активировать команду, указанную в качестве аргумента при запуске указанного скрипта. Т.е. "bash script wc -w" должен давать количество слов для каждого файла в текущем каталоге, но не для каких-либо папок, чтобы в выводе никогда не было строк "/ sub / dir: Is a directory".
Мой текущий скрипт:
#!/bin/bash
dir=`pwd`
for file in $dir/*
do
$* $file
done
Мне просто нужно исключить каталоги для цикла, но я не знаю как.
if [ -f "$file" ]; then ...
. Не каталог будет возвращать не только обычные файлы, но и сокеты и символические ссылки.! -d
уже.Вот альтернатива использованию цикла for, если то, что вам нужно сделать, просто (и не требует установки переменных в основной оболочке & c).
Вы можете использовать
find
с-exec
и использовать,-maxdepth 1
чтобы избежать повторения в подкаталоге.Он
[ -n "$1" ]
существует для того, чтобы избежать выполнения всех файлов в каталоге, когда сценарию не переданы никакие аргументы.источник
В zsh вы можете использовать глобальные квалификаторы для ограничения совпадений по шаблону по типу файла. Например, добавление
(.)
после шаблона ограничивает его обычными файлами.Чтобы справиться с именами файлов, начинающимися с
-
или.
, используйтеwc -c -- *(.N)
илиwc -c ./*(.N)
. Если вы хотите включить символические ссылки и в обычные файлы, сделайте это*(-.)
.Другие распространенные оболочки не имеют такой функции, поэтому вам нужно использовать какой-то другой механизм для фильтрации по файлам, такой как тестирование типов файлов в цикле или
find
.источник
Bash for loop, исключая подкаталоги ('/') и ссылки (@):
источник