Bash скрипт для переименования файлов в каталоге

Я пытаюсь написать скрипт, который принимает каталог в качестве параметра командной строки и перебирает файлы в каталоге, меняя их расширение на .bu.

Я думал, что это будет работать, но я получение выхода '.bu' is not a target directory

#!/bin/bash

for  f in $1; do
  mv "$f".* .bu
done
5
задан 4 May 2015 в 12:20

4 ответа

#!/bin/bash
cd $1
for f in *; do 
mv  "$f" "${f%.*}.bu"
done
8
ответ дан 4 May 2015 в 22:20

Попробуйте это вместо этого (предполагающий, что $1 папка):

for f in $1/*; do 
  mv "$f" "$f.bu"
done

Или использование переименовать утилита:

rename -v 's/$/\.bu/' $1/*

Те команды добавляют расширение. Если Вы хотите к , изменяют существующее расширение использование что:

rename -v 's/\.[^\.]+$/\.bu/' $1/*
5
ответ дан 4 May 2015 в 22:20

Проявляя подход KISS, я рекомендовал бы следующий сценарий

#! /bin/bash
cd $1;
rename 's/$/\.bu/' *

, Это изменит рабочий каталог на первый параметр и затем добавит .bu расширение всех файлов. Это аннулирует потребность для цикла.

РЕДАКТИРОВАНИЕ:
, Если Вы хотите изменить расширение (вместо того, чтобы просто добавить его), можно попробовать

rename 's/\..*$/\.bu/' *

команда вместо этого, в вышеупомянутом сценарии.

2
ответ дан 4 May 2015 в 22:20

$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)
1
ответ дан 4 May 2015 в 22:20

Другие вопросы по тегам:

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