Я пытаюсь написать сценарий, который принимает каталог как параметр командной строки и выполняет итерацию по файлам в каталоге, изменяя их расширение на .bu.
Я думал, что это сработает, m получение выходного сигнала '.bu' is not a target directory
#!/bin/bash
for f in $1; do
mv "$f".* .bu
done
Попробуйте это вместо этого (предполагается, что $1 является папкой):
for f in $1/*; do
mv "$f" "$f.bu"
done
Или используйте служебную программу переименования:
rename -v 's/$/\.bu/' $1/*
Эти команды добавляют расширение. Если вы хотите изменить существующее расширение, используйте:
rename -v 's/\.[^\.]+$/\.bu/' $1/*
Принимая подход KISS, я бы рекомендовал следующий скрипт
#! /bin/bash
cd $1;
rename 's/$/\.bu/' *
Это изменит рабочий каталог на первый параметр, а затем добавит расширение .bu ко всем файлам. Это уменьшает необходимость в цикле.
EDIT: если вы хотите изменить расширение (а не просто добавить его), вы можете попробовать
rename 's/\..*$/\.bu/' *
вместо этого в выше сценарий.
$1 в сценарии bash является ссылкой на аргумент кулака, переданный из командной строки, поэтому вы пытаетесь обработать одну папку.
Уже есть ответы на вопрос о том, как для решения вашей проблемы с использованием pure bash, но я хотел бы добавить, что если вам нужна более эффективная фильтрация обрабатываемой информации, вы можете использовать find с некоторыми параметрами для выбора файлов, которые необходимо обработать:
find <path_to_directory> -maxdepth 1 -type f
* & lt; path_to_directory & gt; = путь к каталогу
Затем перебираем список файлов с помощью перенаправления stdin:
#!/bin/bash
while read file
do
rename 's/\..*/\.bu/' $file
done <<< $(find $1 -maxdepth 1 -type f)