我有一个交互式脚本,可以对未排序文件夹中的各种文件类型进行排序和处理到新创建的目录中。
我想知道如何编写一个小脚本或修改现有脚本,以便我可以在需要时展开/撤消执行的脚本及其排序过程回到文件夹(预排序)状态。
实现这一目标的最精简的方法是什么?
#!/bin/bash
read -p "Good Morning, Please enter your file type name for sorting [ENTER]:" all_extensions
if cd /Users/christopherdorman/desktop
then while read extension
do destination="folder$extension"
mkdir -p "$destination"
mv -v unsorted/*."$extension" "$destination"
done <<< "${all_extensions// /$'\n'}"
mkdir -p foldermisc
if mv -v unsorted/* "foldermisc"
then echo "Good News, the rest of Your files have been successfully processed"
fi
for i in folder*/; do
ls -S "$i" > "${i}filelist"
cat "${i}filelist" >> ~/desktop/summary.txt
done
fi
答案1
下面是一个函数,您可以在(成功的)mv
命令之后调用它,为其提供与 相同的参数mv
,该函数将回显相应的命令,这些命令应将文件放回到原来的位置。您也可以将这些命令重定向到回退文件;它们也被注释掉,只是作为安全预防措施。
function mvbackout {
declare -a files
for f
do
files+=("$f")
done
# remove the last parameter (the destination)
unset files[$(( $# - 1 ))]
dest=$f
printf "# cd -- %s\n" "$PWD"
for f in "${files[@]}"
do
printf "# mv -- '%s' '%s'\n" "${dest}/$(basename "$f")" "$f"
done
}
该函数(无法)从数据丢失情况中恢复(初始 mv 命令意外破坏了文件;或者文件后来被移动或删除),但对于主要思想来说,它应该可以工作。
重要警告
因为将 shell 命令重新引用回 shell 很棘手,所以我用单引号将文件名引起来,这意味着复制/粘贴结果命令将不起作用如果该命令中的任何文件名都包含单引号。
这是一个示例运行:
$ mkdir dest
$ touch a b
$ mkdir -p subdir1/subdir2/subdir3 mkdir fun\'d\'ir fun\'d\'ir/fun\"d\"ir
$ touch subdir1/c subdir1/subdir2/d subdir1/subdir2/subdir3/e
$ mv a b subdir1/c subdir1/subdir2/d subdir1/subdir2/subdir3/e dest
$ mvbackout a b subdir1/c subdir1/subdir2/d subdir1/subdir2/subdir3/e dest
# cd -- /home/schaller/tmp/dir
# mv -- 'dest/a' 'a'
# mv -- 'dest/b' 'b'
# mv -- 'dest/c' 'subdir1/c'
# mv -- 'dest/d' 'subdir1/subdir2/d'
# mv -- 'dest/e' 'subdir1/subdir2/subdir3/e'
对于您的脚本,您可以在每个之后添加另一行mv
,如下所示:
...
mv -v unsorted/*."$extension" "$destination"
mvbackout unsorted/*."$extension" "$destination"
...
if mv -v unsorted/* "foldermisc"
then
mvbackout unsorted/* "foldermisc"
echo "Good News, the rest of Your files have been successfully processed"
fi