我正在尝试构建.sh脚本来帮助我清除巨大的Gallery文件夹。这是我第一次使用bash脚本,并且运行不正常。
文件夹结构为:
gallery/
gallery1/
dynamic/
thumbs/
oldfile.jpg_backup
oldfile.jpg
gallery2/
dynamic/
thumbs/
oldfile.jpg_backup
oldfile.jpg
..依此类推。
这是应该如何工作的:
我以这种方式尝试过,但是我挂在“ if [DIRECTORY]”行上。因为我不知道该怎么做,所以弥补了这一点。任何帮助将不胜感激
for f in ~/gallery/*;
do
[ -d /thumbs ] && rm -r thumbs/ && echo Thumbs deleted...
[ -d /dynamic ] && rm -r dynamic/ && echo Dynamic deleted...
if [ DIRECTORY == "*.jpg_backup" ]
then
rm *.jpg
rename 's/.jpg_backup/.jpg/' *
fi
done;
答案 0 :(得分:1)
#!/usr/bin/env bash
set -o errexit
set -o xtrace
for d in gallery/*; do
rm -vrf "$d/thumbs" "$d/dynamic"
if [[ -n "$(shopt -s nullglob; echo $d/*.jpg_backup)" ]]; then
rm -rf "$d"/*.jpg
for f in "$d"/*.jpg_backup; do
mv -v "$f" "${f%_backup}"
done
fi
done
参考文献:
答案 1 :(得分:1)
您不是在循环中使用$f
变量来处理每次迭代中的文件和子目录。
for f in ~/gallery/*;
do
[ -d "$f/thumbs" ] && rm -r "$f/thumbs" && echo "$f/dynamic" deleted...
[ -d "$f/dynamic" ] && rm -r "$f/dynamic" && echo "$f/dynamic" deleted...
if compgen -G "$f/*.jpg_backup" >/dev/null
then
rm "$f"/*.jpg
rename 's/.jpg_backup/.jpg/' "$f"/*.jpg_backup
fi
done;
我在Test whether a glob has any matches in bash中找到了compgen
命令。
但是所有这些循环似乎都是不必要的。您可以这样做:
rm -rf ~/gallery/*/{thumbs,dynamic}
rename -f 's/.jpg_backup/.jpg/' ~/gallery/*/*.jpg_backup
-f
的{{1}}选项告诉它允许替换现有文件,因此不需要rename
命令。