Изменение разрешения для нескольких файлов в bash

Ваш существующий код проверяет наличие файла с именем*.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в текущем каталоге. Затем он начинает искать первый обычный файл или символическую ссылку на обычный файл среди совпавших имен (код предполагает, что *.csvglob может расширяться до имен каталогов и т. д. ). Если найден обычный файл или символическая ссылка на него, он переименовывает этот файл в listing.txt.

В оболочке zsh:

mv -- *.csv(-.[1]) listing.txt

Здесь используется модификатор glob для *.csvшаблона подстановки, который возвращает первый обычный файл или символическую ссылку, соответствующую шаблону.

-1
26.02.2020, 19:21
2 ответа

Ваша переменная filesпредставляет собой массив, и $filesрасширяется до первого элемента, как вы заметили. Чтобы выполнить chmodдля всех элементов массива, используйте

chmod +x "${files[@]}"
4
28.04.2021, 23:22

Вы определили массив, поэтому можете перебирать его в цикле:

for file in "${files[@]}"; do
  chmod +x "$file"
done
1
28.04.2021, 23:22

Теги

Похожие вопросы