Скрипт Bash для перемещения файлов при создании каталогов

У меня есть этот скрипт, чтобы перебрать все папки и переместить файлы, которые старше 2 лет. Я использую команду установки, потому что она создает необходимые каталоги по пути назначения, а затем я удаляю исходный код. Я хотел бы изменить сценарий, чтобы использовать mv команда, так как это намного быстрее, чем копировать файл, а затем удалить его. Но я не знаю, как получить путь без имени файла для передачи в mkdir -p команда? Как мне изменить скрипт?

for d in *; do

find  "$d" -type f -mtime +730 -exec sh -c '

 echo "moving $d/{}" &&
 install -Dp "/data/Customer Files$d/{}" "/data/Customer Files Over 2 Years Old$d/{}" &&
 rm -f "/data/Customer Files$d/{}"' \;

done

1 ответ

Тебе нужно dirname но будьте осторожны, если вы дадите ему имя каталога, он даст вам путь до родительского каталога, может быть, пример будет проще:

$ dirname /usr/bin/ bash
/ USR / бен

$ dirname / usr / bin
/ USR

Возвращаясь к вашему сценарию, тонкость dirname не проявляется при поиске файлов. Я тоже немного упростил, мне не понравился подоболочка, без меня разобрать проще. Это становится:

#!/bin/bash

SRC=./src
DST=./dst

for f in `cd $SRC && find . -type f -mtime +730`; do
    echo "moving $f"
    mkdir -p "$DST/`dirname $f`"
    mv "$SRC/$f" "$DST/$f"
done

Очевидно, вы должны установить SRC / DST для ваших нужд.

КСТАТИ, mv тогда быстрее cp + rm когда вы находитесь на той же файловой системе FWIK.

Другие вопросы по тегам