5

Поэтому я должен найти все файлы в данном каталоге с суффиксом.C или cc, и измените их имя на.C.blah или .cc.blah

Есть команда, чтобы сделать это?

Или я должен реализовать это с помощью команды find?

4 ответа4

6

Есть несколько подходов, в зависимости от того, что доступно на вашем * nix.

Вокруг две разные команды rename , одна из которых предоставляется через perl, а другая как часть стандартных утилит.

Версия Perl:

rename 's/(\.cc$|\.C$)/$1.blah/' *.cc *.C

версия utils - вы можете сделать это одной строкой:

rename .C .C.blah *.C
rename .cc .cc.blah *.cc

для цикла:

for i in *.C *.cc ; do mv $i $i.blah ; done
1

Я знаю, что вы уже нашли свое приемлемое решение, но я хочу опубликовать то, что я обычно использую на работе. Этот синтаксис работает для GNU findutils, который является частью любого современного дистрибутива Linux.

## xargs is much faster than -exec, xargs can run parallel on # cores with -P #
find ./ -type f -name '*.C' -o -name '*.cc' | xargs -I '{}' mv '{}' '{}'.BAK

##  If I'm specifying more than two extensions, I would generally use a regex
find ./ -type f -regex ".*\.\(C\|cpp\)$" | xargs -I '{}' mv '{}' '{}'.BAK

Особенно с распространенными сейчас четырехъядерными SMP-серверами, вы можете использовать половину времени работы с -p 4 . Даже имея только одно ядро, xargs избегает посторонней find ...-exec будет инициирован. С рабочим столом и неограниченным временем это не проблема. С другой стороны, использование ресурсов сервера и работа со многими тысячами файлов, предотвращение ненужных накладных расходов является приоритетной задачей.

1

используйте простой цикл for:

for file in *.txt; do echo $file $file.blah; done

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

for file in *.txt; do mv $file $file.blah; done

В любом случае, это не будет переименовывать файлы * .txt в подкаталогах. Используйте поиск для этого.

0

Есть две разные команды rename .

В дистрибутивах Ubuntu/Debian/...:

rename -v 's/$/.blah/' *.C *.cc

На RedHat/CentOS/... дистрибутивах:

rename -v $ .blah *.C *.cc

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .