Ваш существующий код проверяет наличие файла с именем*.csv
(буквально ). Вот почему это не работает. Это происходит потому, что *
находится в двойных кавычках.
Использование [ -f *.csv ]
не будет работать должным образом, если шаблону соответствует несколько файлов. Если есть несколько файлов, соответствующих *.csv
, команда cp
также не будет работать должным образом, если только listing.txt
не является именем каталога.
Чтобы переименовать первый из файлов, соответствующих шаблону подстановки имен файлов *.cvs
в текущем каталоге, сделайте следующее:
#!/bin/sh
set -- *.csv
while [ "$#" -gt 0 ] && [ ! -f "$1" ]; do
shift
done
if [ -f "$1" ]; then
mv -- "$1" listing.txt
fi
Сначала устанавливаются позиционные параметры, $1
, $2
и т. д., все имена, соответствующие *.csv
в текущем каталоге. Затем он начинает искать первый обычный файл или символическую ссылку на обычный файл среди совпавших имен (код предполагает, что *.csv
glob может расширяться до имен каталогов и т. д. ). Если найден обычный файл или символическая ссылка на него, он переименовывает этот файл в listing.txt
.
В оболочке zsh
:
mv -- *.csv(-.[1]) listing.txt
Здесь используется модификатор glob для *.csv
шаблона подстановки, который возвращает первый обычный файл или символическую ссылку, соответствующую шаблону.
Ваша переменная files
представляет собой массив, и $files
расширяется до первого элемента, как вы заметили. Чтобы выполнить chmod
для всех элементов массива, используйте
chmod +x "${files[@]}"
Вы определили массив, поэтому можете перебирать его в цикле:
for file in "${files[@]}"; do
chmod +x "$file"
done