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

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

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

#!/bin/bash

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

3 ответа

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

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

Или используйте служебную программу переименования:

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

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

rename -v 's/\.[^\.]+$/\.bu/' $1/*
5
ответ дан 23 May 2018 в 21:05
  • 1
    Это добавляет расширение, оно не меняет его – kos 24 April 2015 в 09:24
  • 2
    @kos, OP говорит, что «принимает каталог как параметр командной строки», поэтому это действительно. Я хотел бы только упомянуть, что если в каталоге есть пробел n имя, OP должен добавить двойные кавычки, и я бы объявил двойные кавычки до $ 1 – Sergiy Kolodyazhnyy 24 April 2015 в 09:29
  • 3
    @Serg "принимает каталог как параметр командной строки и выполняет итерацию по файлам в каталоге, изменяя их расширение на .bu " поэтому OP хочет переименовать файлы. В любом случае +1 для редактирования – kos 24 April 2015 в 09:41
  • 4
    @kos ах, я вижу сейчас. Может ли это быть заменено на for f in $( ls $1 )? – Sergiy Kolodyazhnyy 24 April 2015 в 09:48
  • 5
    @Serg Да, что бы сделать – kos 24 April 2015 в 09:52

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

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

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

EDIT: если вы хотите изменить расширение (а не просто добавить его), вы можете попробовать

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

вместо этого в выше сценарий.

2
ответ дан 23 May 2018 в 21:05

$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)
1
ответ дан 23 May 2018 в 21:05

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

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