Вообще говоря, Вы не можете предположить, что вывод различных инструментов имеет то же значение. Вы имеете к RTM.
А именно, эти три столбца в iftop
средний трафик во время последних 2, 10 и 40 секунд.
Некоторый подобный вывод на другом программном обеспечении мог означать что-то еще (как, минимум, среднее число и максимум).
В соответствии с Linux, с помощью rename
от утилит Linux (rename.ul
под Debian и Ubuntu):
rename src dst src/1 src/2/3 # dst/2 must exist
С rename
Сценарий Perl, который Debian и Ubuntu устанавливают как prename
или rename
:
rename 's!^src!dst!' src/1 src/2/3 # dst/2 must exist
rename 'use File::Basename; use File::Path;
s!^src!dst! && mkpath(dirname($_))' src/1 src/2/3
Вот функция оболочки, которая делает то, что Вы спрашиваете за исключением порядка аргументов:
mv-preserving-structure () {
s=${1%/} t=${2%/}; shift 2
for x; do
case $x in
$s/*)
y=$t${x#$s}
mkdir -p -- "${y%/*}"
mv -- "$x" "$t${x#$s}";;
esac
done
}
mv-preserving-structure src dst src/1 src/2/3
> tar -cf - src/1 src/2/3 | (mkdir dst; cd dst; tar -xv --strip-components=1 -f -)
Предполагает, что удар и GNU находят.
mv_preserve_structure() {
local src_file="$1"
local dest="$2"
local rel_dir="$(dirname "$src_file")/"
rel_dir="${rel_dir#*/}" # returns "2/3" if rel_dir was "src/2/3"
mkdir -p "$dest/$rel_dir"
mv "$src_file" "$dest/$rel_dir"
}
# unlike mv, this requires the destination dir as the first parameter
mv_dirs() {
local dest="$1"
shift
for dir in "$@"; do
for filename in "$dir"/*; do
[[ -f "$filename" ]] && mv_preserve_structure "$filename" "$dest"
done
done
}
mv_dirs dst src src/1 src/2/3