Я пытаюсь написать скрипт, который принимает каталог в качестве параметра командной строки и перебирает файлы в каталоге, меняя их расширение на .bu
.
Я думал, что это будет работать, но я получение выхода '.bu' is not a target directory
#!/bin/bash
for f in $1; do
mv "$f".* .bu
done
#!/bin/bash
cd $1
for f in *; do
mv "$f" "${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
расширение всех файлов. Это аннулирует потребность для цикла.
РЕДАКТИРОВАНИЕ:
, Если Вы хотите изменить расширение (вместо того, чтобы просто добавить его), можно попробовать
rename 's/\..*$/\.bu/' *
команда вместо этого, в вышеупомянутом сценарии.
$1
в bash
сценарий является ссылкой на аргумент кулака, переданный из командной строки, таким образом, Вы на самом деле пытаетесь обработать единственную папку.
существуют ответы уже о том, как решить Вашу проблему с помощью чистого bash
, но я хотел бы добавить, что при необходимости в лучшей фильтрации того, что обрабатывается, можно использовать find
с некоторыми опциями выбрать файлы, которые будут обработаны:
find <path_to_directory> -maxdepth 1 -type f
*< path_to_directory> = соедините каналом к каталогу
Затем цикл по списку файлов с помощью stdin
перенаправление:
#!/bin/bash
while read file
do
rename 's/\..*/\.bu/' $file
done <<< $(find $1 -maxdepth 1 -type f)