В bash я часто использую циклы for, такие как
for file in *.type; do
sommecommand "$file";
done;
выполнить операцию для всех подходящих файлов *.type
. Если в рабочих каталогах не найдено ни одного файла с таким окончанием, звездочка не раскрывается, и обычно я получаю сообщение об ошибке, в котором говорится, что какая-то команда не нашла файл. Я могу сразу подумать о нескольких способах избежать этой ошибки. Но добавление условия не кажется слишком элегантным. Есть короткий и чистый способ достичь этого?
*.txt
. Стоит проверить, существует ли файл.break
вместоcontinue
).В bash вы можете использовать
shopt -s nullglob
расширение до пустого массива, если совпадений нет.В оболочках POSIX без
nullglob
, вы можете избежать этой проблемы, проверив, что переданное имя файла действительно существует, имея[ -e "$file" ] || [ -L "$file" ] || continue
в качестве первой части вашегоfor
цикла.источник
[ -e
вернет false для недоступных файлов или файлов, которые являются символическими ссылками на недоступные или несуществующие файлы.chmod 0 the_file
, по-[ -e the_file ]
прежнему оценивает верно, поэтому оно должно быть что - то еще.mkdir -p x/{a,b} && chmod 444 x && echo x/* && [ -e x/a ]
. x / a недоступен, но поскольку x читабелен, x / * будет расширяться.Обычная техника для раковин, у которых нет
nullglob
выбора,Дополнительным
[*].type
является охват случая, когда*.type
в текущем каталоге вызывается один файл .Теперь, если вы хотите включить точечные файлы, это становится более сложным .
Я полагаю, что эта техника была придумана Лорой Фэйрхед на Usenet несколько лет назад.
источник
find . -name '*.type' -maxdepth 0 -exec somecommand "{}" ";"
Это полностью удаляет
for
цикл и глобус оболочки из уравнения.find
выполнит-exec
команду один раз за совпадение, и если совпадений нет, она никогда не будет выполнена. В-maxdepth 0
инструктирует найти не рекурсию в подкаталоги с именем пути-аргумента (.
в данном случае).Недостатком является то, что оно включает в себя другое приложение, хотя оно присутствует практически во всех системах Linux (и, вероятно, в большинстве Unixes).
источник