Вывод имени каждого файла с определенным расширением

#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" , за исключением того, что ваш код прерывается всевозможными символами в именах файлов, и правильный способ всегда работает.