Выборочное рекурсивное перемещение?

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

А именно, эти три столбца в iftop средний трафик во время последних 2, 10 и 40 секунд.

Некоторый подобный вывод на другом программном обеспечении мог означать что-то еще (как, минимум, среднее число и максимум).

2
21.03.2011, 19:42
3 ответа

В соответствии с 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
0
27.01.2020, 22:16
> tar -cf - src/1 src/2/3 | (mkdir dst; cd dst; tar -xv --strip-components=1  -f -)
1
27.01.2020, 22:16
  • 1
    Чрезмерно сложный для простой копии, но хорошо. Кроме вопроса был о перемещении файлов. –  Gilles 'SO- stop being evil' 21.03.2011, 22:10
  • 2
    Кроме того, это возьмет каждый подкаталог под src/1 и т.д., который я полагаю, что OP не хочет. –  glenn jackman 21.03.2011, 22:47
  • 3
    @glenn jackman, я думаю, что он действительно хочет переместить целое src/1 поддерево, хотя я соглашаюсь с @Giles, что это копирует, не перемещение, таким образом, не действительно решение. –  JRW 21.03.2011, 23:52
  • 4
    На самом деле я интересуюсь и mv и CP. Оба с или без подкаталогов. Таким образом, это решение полезно, также. –  maaartinus 22.03.2011, 01:13

Предполагает, что удар и 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
1
27.01.2020, 22:16
  • 1
    я не понимаю назначение использования find. –  Gilles 'SO- stop being evil' 21.03.2011, 22:10
  • 2
    @Gilles, только для получения списка файлов только на уровне каталога. обновленный. –  glenn jackman 21.03.2011, 22:58

Теги

Похожие вопросы