SLEDopit писал(а): ↑27.11.2013 14:27
V112
с более менее приличным списком файлов ваш вариант будет работать чертовски долго, если сравнивать с решениями целиком на find.
Целиком на find - это с -exec что ли? Среди всех предложенных вариантов с -exec
только один, незаслуженно оставленный без внимания автором темы, будет работать быстрее. Остальные - также медленны и печальны, как и скрипт:
Код: Выделить всё
$ seq 1 10000 | sed 's/^/daily./' | xargs touch
$ find . -type f -name 'daily*' | wc -l
10000
$ time find . -type f -name 'daily*' -exec rename 's/daily/weekly/' {} \;
real 2m56.762s
user 2m16.505s
sys 0m22.553s
$ find . -type f -name 'weekly*' | wc -l
10000
и
Код: Выделить всё
$ seq 1 10000 | sed 's/^/daily./' | xargs touch
$ find . -type f -name 'daily*' | wc -l
10000
$ cat ./t.sh
#!/bin/sh
find -type f -name "daily.*" |
while read i
do
dirname="$(dirname "${i}")"
oldname="$(basename "${i}")"
newname="$(echo "${oldname}" | sed 's/daily/weekly/')"
if [ "${oldname}" != "${newname}" ]
then
mv "${i}" "${dirname}/${newname}"
fi
done
$ time ./t.sh
real 1m34.802s
user 0m0.892s
sys 0m6.864s
$ find . -type f -name 'weekly*' | wc -l
10000
Скрипт даже оказался почти в два раза быстрее: 2.56 минуты против 1.34 минуты у скрпта, но оба эти результата, конечно, целая вечность по сравнению с '-exec {} \+' или '| xargs rename':
Код: Выделить всё
$ seq 1 10000 | sed 's/^/daily./' | xargs touch
sgf@shilvana:~/test$ find . -type f -name 'daily*' | wc -l
10000
$ time find . -type f -name 'daily*' -exec rename 's/daily/weekly/' {} \+
real 0m0.460s
user 0m0.272s
sys 0m0.180s
$
$ find . -type f -name 'weekly*' | wc -l
10000
Код: Выделить всё
$ seq 1 10000 | sed 's/^/daily./' | xargs touch
$ find . -type f -name 'daily*' | wc -l
10000
$ time find . -type f -name 'daily*' | xargs rename 's/daily/weekly/'
real 0m0.469s
user 0m0.256s
sys 0m0.208s
$ find . -type f -name 'weekly*' | wc -l
10000
В результате, вариант, который автор назвал "не имеет смысла" (
#10), обгоняет выбранный им в 5.5 раз всего лишь на 10к файлов. Хех..
и количество вызовов команды-таки остается решающим.
Upd. Исправил неправильный копипаст.