У меня есть этот сценарий, чтобы перебирать все папки и перемещать файлы, которым больше двух лет. Я использую команду установки, потому что она создает необходимые каталоги по пути назначения, а затем я удаляю источник. Я бы хотел изменить сценарий, чтобы использовать 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
Тебе нужно dirname
но будьте осторожны, если вы дадите ему имя каталога, он предоставит вам путь до родительского каталога, возможно, пример проще:
$ dirname / usr / bin / bash
/ usr / bin$ dirname / usr / bin
/ usr
Возвращаясь к вашему сценарию, тонкость имени каталога не играет роли, когда вы ищете файлы. Я тоже его немного упростил, подоболочка мне не понравилась, мне без нее проще разбираться. Это становится:
#!/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.