2016-04-04 6 views
0

Моя задача - написать скрипт, который ищет все файлы без расширения .old в данной директории и переименовывает файлы в указанный формат: filename.old. Я пробовал этот скрипт:Переименовать все файлы, найденные расширением in for loop

#!/bin/bash 
for i in $(grep "\.[^old]&" $1 | ls) 
do 
mv "$1/$i" "$1/$i.old" 
done 

но он дает неправильный выход.

  • Данные файлы были в моем каталоге: f1, f2.old, f3, f4.old.
  • Ожидаемый результат: f1.old, f2.old, f3.old, f4.old.
  • Мой выход (1-й запуск): f1.old, f2.old.old, f3.old, f4.old.old. Каждый раз, когда я запускаю скрипт, он продолжает добавлять расширение .old, поэтому он становится примерно таким:
  • Мой выход (2-й запуск): f1.old.old, f2.old.old.old, f3.old.old, f4.old.old.old.

Как это можно улучшить?

ответ

1

Вы можете использовать одну гильзу так:

find . -mindepth 1 ! -name '*.old' -exec mv {} {}.old \; 

примера на GNU/Linux (Ubuntu 14.04 LTS):

mkdir so 
cd so 
touch f1 f2.old f3 f4.old 
find . -mindepth 1 ! -name '*.old' -exec mv {} {}.old \; 
ls 

Результат:

f1.old f2.old f3.old f4.old 

Объяснение:

  • find . средства поиска в текущем каталоге
  • -mindepth 1 возвратит файлы без возвращения текущего каталога . (см https://askubuntu.com/questions/153770/how-to-have-find-not-return-the-current-directory)
  • ! -name '*.old' будет пропускать любые файлы, заканчивая .old
  • -exec mv выполняет команду mv (перемещение) на возвращенные файлы, обозначенные как {}, и добавление к нему добавочного номера с {}.old, означающее any-filename-was-returns.old

Вы можете изменить свой сценарий, как так, чтобы получить подобный результат:

test.sh.old

#!/bin/bash 
for i in $(find . -mindepth 1 ! -name '*.old'); do 
     mv "$i" "$i.old" 
done 

Execute с bash test.sh.old, чтобы получить аналогичные результаты.

Возможно, вам придется попробовать несколько тестовых примеров, чтобы проверить, проходит ли однострочный файл и модифицированный файл test.sh.old те условия тестирования. Я тестировал его с образцом, который вы предоставили, и это возвращает желаемые результаты.

+0

спасибо. Ваше решение работает отлично. Я использовал ваш скрипт с одним изменением, заменил. с $ 1. – Anthony

 Смежные вопросы

  • Нет связанных вопросов^_^