Пакетное переименование файлов в OSX-терминале

Я пытаюсь переименовать файлы, например screen-0001.tif на 0001.tif используя подход в этом вопросе SO:

for file in *.tif
do
 echo mv "$file" "${screen-/file}"
done

ничего не меняет. Благодарен за идею, где я ошибаюсь.

2 ответа

Две вещи:

  1. Вы эхом отдаете команды, а не выполняете их. Я сделаю это, когда буду делать массовые переименования, чтобы убедиться, что команда работает правильно. Я могу перенаправить вывод в файл, а затем использовать этот файл в качестве сценария оболочки.
  2. Замена неверна. Существует два способа:
    1. ${file#screen-} больше всего фильтра ${file#screen-}.
    2. Замена: ${file/screen/}

Имя переменной среды всегда идет первым. Затем тип шаблона, затем шаблон

Вот как я это сделаю:

$ for file in *.tif
> do
> echo "mv '$file' '${file#screen-}'"
> done | tee mymove.sh # Build a shell script 
$ vi mymove.sh # Examine the shell script and make sure everything is correct
$ bash mymove.sh # If all is good, execute the shell script.


Проще, IMHO, способ сделать это, используя Perl rename script. Здесь я использую его с --dry-run поэтому он просто говорит вам, что он будет делать, а не делать что-либо вообще. Вы просто удалите --dry-run если/когда вы довольны командой:

rename --dry-run 's/screen-//' *tif

'screen-001.tif' would be renamed to '001.tif'
'screen-002.tif' would be renamed to '002.tif'
'screen-003.tif' would be renamed to '003.tif'
'screen-004.tif' would be renamed to '004.tif'

Он имеет дополнительное преимущество, что он не будет перезаписывать файлы, которые происходят с тем же именем. Итак, если у вас есть файлы:

screen-001.tif
0screen-01.tif

И вы сделали это, вы получите:

rename 's/screen-//' *tif
'screen-001.tif' not renamed: '001.tif' already exists

rename легко устанавливается с помощью Homebrew, используя:

brew install rename

licensed under cc by-sa 3.0 with attribution.