外壳:移动列表中列出的文件和文件夹



我使用的是Alpine Linux,希望从列表中移动指定的文件和文件夹。我的最终目标是通过备份文件夹中的一些文件和文件夹来重置文件夹

这是我当前的脚本:

cd /mnt/server
mkdir /tmp/backup
[ -d folderOne ] && mv folderOne /tmp/backup
[ -f fileOne.txt ] && mv fileOne.txt /tmp/backup
rm -fr *
rm -fr .*
[ -d /tmp/backup/folderOne ] && mv /tmp/backup/folderOne /mnt/server
[ -f /tmp/backup/fileOne.txt ] && mv /tmp/backup/fileOne.txt /mnt/server
rm -fr /tmp/backup

我想使用一个列表来避免脚本冗余,并尽可能少地使用外部软件。因此,我们的想法是有一个列表,其中包含要备份的文件夹和文件的路径。我会使用for循环来遍历列表,如果文件/文件夹存在,则在必要时通过重新创建层次结构来移动它。

folder/folder2/file.txt将重新创建丢失的文件夹并将文件放在那里。如果它是一个文件夹(folder/folderTwo(,那么它会重新创建丢失的层次结构,并将文件夹(及其内容(放在其中

#! /bin/bash
set -eu
workdir=/mnt/server
cd "$workdir"
mkdir /tmp/backup
movables=(folderOne fileOne.txt folder/folder2/file.txt)
for move in "${movables[@]}" ; do
if [[ -d $move || -f $move ]] ; then
if [[ "$move" = */* ]] ; then
mkdir -p /tmp/backup/"${move%/*}"
fi
mv "$move" /tmp/backup/"${move%/*}"
fi
done
shopt -s extglob
rm -fr !(.|..)
find /tmp/backup
for move in "${movables[@]}" ; do
if [[ -d /tmp/backup/$move || -f /tmp/backup/$move ]] ; then
if [[ "$move" = */* ]] ; then
mkdir -p "$workdir/${move%/*}"
fi
mv /tmp/backup/"$move" "$workdir"
fi
done
rm -fr /tmp/backup

最新更新