Причиной, почему это не работает автоматический ATOW, является известная ошибка удара, которая предотвращает переменные типа массив экспорта (см. ошибки раздела в странице справочника). К сожалению, DIRSTACK является переменной типа массив.
Я создал замены для pushd/popd/dirs, которые переносят их, но хранят их материал в скалярной переменной, так, чтобы дочерние процессы знали о нем.
Если Вы будете получать код ниже и будете использовать mypushd/mypopd/mydirs вместо оригиналов, то дочерние процессы будут помнить стопку своих родителей. Заметьте, что это не будет работать с каталогами, имя которых включает двоеточие!
Предупредите меня при определении какой-либо ошибки потому что я просто записал это. Кроме того, если Вы знаете о более простой альтернативе, совместно используйте!
export SCALARDIRSTACK
export DIRSTACK
update_dirstack()
{
if [ ! -z "$SCALARDIRSTACK" ]; then
dirs -c
# get an array from scalardirstack
IFS=':' read -a tmp <<< "$SCALARDIRSTACK"
# traverse in reverse order to pushd stuff into the stack
for (( idx=${#tmp[@]}-1 ; idx>=0 ; idx-- )) ; do
# gotta use pushd/popd this to manipulate DIRSTACK
pushd -n ${tmp[idx]} > /dev/null
done
fi
}
update_scalardirstack()
{
if [ ${#DIRSTACK[@]} -gt 1 ]; then
SCALARDIRSTACK=$(printf '%q:' ${DIRSTACK[@]:1}) # string from array
else
SCALARDIRSTACK=""
fi
}
scalar_dstack_wrap()
{
update_dirstack
$@
update_scalardirstack
}
alias mydirs='scalar_dstack_wrap dirs'
alias mypushd='scalar_dstack_wrap pushd'
alias mypopd='scalar_dstack_wrap popd'
Не уверен, что полностью понял ваш вопрос, но что насчет:
find . -type f -exec pv -N {} {} \; > /dev/null
Дает вывод типа:
./file1: 575kB 0:00:00 [1.71GB/s] [=======================>] 100%
./file2: 15.2GB 0:00:07 [2.22GB/s] [==> ] 15% ETA 0:00:38
Вместо использования cp
и find
для этой задачи вы можете подумать об использовании rsync
.
$ time rsync -avvz -O --stats --checksum --human-readable \
--acls --itemize-changes --progress \
--out-format='[%t] [%i] (Last Modified: %M) (bytes: %-10l) %-100n' \
"<fromDir>" "<toDir>" | tee /path/to/log.txt
Будет создан отчет, который выглядит следующим образом.
команда
$ time rsync -avvz -O --stats --checksum --human-readable --acls --itemize-changes --progress --out-format='[%t] [%i] (Last Modified: %M) (bytes: %-10l) %-100n' "How_to_Write_Shared_Libraries" "/home/saml/newdir/." | tee ~/rsync.txt
подробные сведения о каждом переданном файле
sending incremental file list
delta-transmission disabled for local transfer or --whole-file
[2014/05/31 15:12:34] [cd+++++++++] (Last Modified: 2014/02/21-15:42:44) (bytes: 4096 ) How_to_Write_Shared_Libraries/
[2014/05/31 15:12:34] [>f+++++++++] (Last Modified: 2013/12/06-19:59:22) (bytes: 766590 ) How_to_Write_Shared_Libraries/dsohowto.pdf
766.59K 100% 20.00MB/s 0:00:00 (xfer#1, to-check=1/3)
[2014/05/31 15:12:34] [>f+++++++++] (Last Modified: 2014/02/21-15:42:44) (bytes: 44 ) How_to_Write_Shared_Libraries/url.txt
44 100% 1.23kB/s 0:00:00 (xfer#2, to-check=0/3)
total: matches=0 hash_hits=0 false_alarms=0 data=766634
статистика о передаче в целом
rsync[5923] (sender) heap statistics:
arena: 1073152 (bytes from sbrk)
ordblks: 5 (chunks not in use)
smblks: 1
hblks: 2 (chunks from mmap)
hblkhd: 401408 (bytes from mmap)
allmem: 1474560 (bytes from sbrk + mmap)
usmblks: 0
fsmblks: 96
uordblks: 410512 (bytes used)
fordblks: 662640 (bytes free)
keepcost: 396928 (bytes in releasable chunk)
rsync[5926] (server receiver) heap statistics:
arena: 286720 (bytes from sbrk)
ordblks: 2 (chunks not in use)
smblks: 5
hblks: 3 (chunks from mmap)
hblkhd: 667648 (bytes from mmap)
allmem: 954368 (bytes from sbrk + mmap)
usmblks: 0
fsmblks: 384
uordblks: 180208 (bytes used)
fordblks: 106512 (bytes free)
keepcost: 102336 (bytes in releasable chunk)
rsync[5925] (server generator) heap statistics:
arena: 135168 (bytes from sbrk)
ordblks: 2 (chunks not in use)
smblks: 6
hblks: 2 (chunks from mmap)
hblkhd: 401408 (bytes from mmap)
allmem: 536576 (bytes from sbrk + mmap)
usmblks: 0
fsmblks: 464
uordblks: 88688 (bytes used)
fordblks: 46480 (bytes free)
keepcost: 32800 (bytes in releasable chunk)
сводная статистика передачи
Number of files: 3
Number of files transferred: 2
Total file size: 766.63K bytes
Total transferred file size: 766.63K bytes
Literal data: 766.63K bytes
Matched data: 0 bytes
File list size: 143
File list generation time: 0.001 seconds
File list transfer time: 0.000 seconds
Total bytes sent: 667.27K
Total bytes received: 54
sent 667.27K bytes received 54 bytes 1.33M bytes/sec
total size is 766.63K speedup is 1.15
время, которое потребовалось
real 0m0.092s
user 0m0.053s
sys 0m0.008s