#linux #bash #foreach
#linux #bash #для каждого
Вопрос:
как я могу распечатать имя каждого файла в определенном каталоге с определенным расширением?
Вот что у меня есть на данный момент:
#!/bin/sh
DIR="~/Desktop"
SUFFIX="in"
for file in $DIR/*.$SUFFIX
do
if [ -f $file ]; then
echo $file
fi
done
К сожалению, это не работает.
Что с этим не так?
Комментарии:
1. Проверять, существует ли файл после того, как он был внесен в список, кажется бессмысленным.
Ответ №1:
В вашем каталоге =»~/ Desktop» символ «~» не развернут, потому что он находится в «». удалите символ «». DIR=~/Desktop
Комментарии:
1. И, кроме того, используйте двойные кавычки вокруг замен переменных :
for file in "$DIR"/*."$SUFFIX"
.
Ответ №2:
Вы могли бы использовать find с -type f
#!/bin/sh
DIR="~/Desktop"
SUFFIX="in"
find "$DIR" -maxdepth 1 -type f -name "*.${SUFFIX}" -exec somecommand {} ;
Комментарии:
1. Структура foreach — это подготовка / тест. Позже файл должен быть передан в jar-файл в качестве аргумента
Ответ №3:
К вашему сведению: «file» в системах Unix обычно является названием команды.
Его цель — проанализировать файлы, указанные в качестве аргумента, и определить формат. Пример:
$ file entries.jar
entries.jar: Zip archive data, at least v2.0 to extract
Ответ №4:
for file in `ls $DIR/*.$SUFFIX`
Обратите внимание на ls
и обратные метки
Комментарии:
1. Он говорит: ls: не удается получить доступ к ~/Desktop /*.in: Нет такого файла или каталога
2. Это не расширяет
~
— используйте фактический полный путь или не заключайте~/Desktop
в кавычки.3. Не анализируйте выходные данные ls. Ваш совет с точностью до наоборот. Ваш код эквивалентен
for file in "$DIR"/*."$SUFFIX"
, за исключением того, что ваш код прерывается всевозможными символами в именах файлов, и правильный способ всегда работает.