Поэтому я должен найти все файлы в данном каталоге с суффиксом.C или cc, и измените их имя на.C.blah или .cc.blah
Есть команда, чтобы сделать это?
Или я должен реализовать это с помощью команды find?
Есть несколько подходов, в зависимости от того, что доступно на вашем * 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
Я знаю, что вы уже нашли свое приемлемое решение, но я хочу опубликовать то, что я обычно использую на работе. Этот синтаксис работает для 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
будет инициирован. С рабочим столом и неограниченным временем это не проблема. С другой стороны, использование ресурсов сервера и работа со многими тысячами файлов, предотвращение ненужных накладных расходов является приоритетной задачей.
используйте простой цикл for:
for file in *.txt; do echo $file $file.blah; done
Эта команда отображает старое имя файла и новый файл в терминале. Если вы получаете ожидаемые результаты, перейдите к настоящей команде:
for file in *.txt; do mv $file $file.blah; done
В любом случае, это не будет переименовывать файлы * .txt в подкаталогах. Используйте поиск для этого.
Есть две разные команды rename
.
В дистрибутивах Ubuntu/Debian/...:
rename -v 's/$/.blah/' *.C *.cc
На RedHat/CentOS/... дистрибутивах:
rename -v $ .blah *.C *.cc