[EDIT]问题已解决。脚本更新如下。感谢大家的帮助。我需要做一些mod,以便在文件夹名称和非空文件夹中使用空格。
这真的很难相处。
当一个文件被下载时,我的系统会创建两个东西:
-
一个文件(在我的"Jobs"目录中创建),例如
- Johns.Pizza.Place.5489231.job
- Marks.Hair.Salon.NY.888.job
- Rachels.Bike.and.Boat.Shop.1122287865.ob
-
带有文件名的文件夹(在我的"Temp"目录中创建),例如
- Johns.Pizza.Place
- Marks.Hair.Salon.NY
- Rachels.Bike.and.Boat.Shop
正如您所看到的,文件夹名称总是与部分文件名匹配,但每个文件总是附加一个随机长度,然后是扩展名(即".job")。
我想做的是能够运行一个尝试的脚本
-
匹配文件目录中的文件夹名称,但只进行部分匹配,因为文件添加了随机数和扩展名,然后
-
当它找不到相关文件时删除这些文件夹(我使用Hazel在某些操作后删除文件)。如果为某个文件夹找到匹配的文件,我不希望删除该文件夹。
这是我尝试过的,但我知道它不完整。很明显,我试图在路径中提取文件夹名称,以与删除了扩展名的部分文件名相匹配,但我不知道如何删除随机数字符串。
[编辑]:下方的最终工作脚本
#! /bin/sh
MainDir="/Users/Dhy/Desktop/Temp Files/1. All Files/"
JobDir="/Users/Dhy/Documents/All Jobs/"
find "$MainDir"* -maxdepth 0 -type d | while read FolderName; do
SuffixName=$(basename "${FolderName}");
preserve=''
for file in "$JobDir"*.job; do
if [[ $file.[0-9]+ =~ $SuffixName ]]; then
preserve='on'
break
fi
done
if [ -z $preserve ]; then
rm -rf "$MainDir$SuffixName"
fi
done
非常感谢您的帮助。
您使用%%是删除第一个点之后的所有内容,而不是最后一个点。像这样的东西可能是你想要的转变:
name="${file%.*.job}"
%运算符是非贪婪的,因此它将选择要删除的最短匹配字符串。
你可以做:
for Dir in $(find $MainDir* -maxdepth 0 -type d ); do
FolderName=$(basename $Dir);
cd /Users/Dhy/Documents/Jobs
if [ -z "$(find . -regex "./$FolderName.[0-9]*.job")" ]
rmdir "$FolderName"
fi
done
如果您绝对确定实际文件名不包含数字,则可以将name=${file%%[.]*}
替换为name=${file%%.[0-9]*}
。
同样在当前脚本中,只要第一个name
与FolderName
不匹配,就可以删除该目录。正确的方法是检查所有name
是否不匹配,即只有在内部for循环结束后才删除目录。如果匹配,请设置一个标志(在下面的情况下,为非空字符串)以防止删除目录。
以下是我的想法:
#!/bin/bash
MainDir="/Users/Dhy/Desktop/Temp/"
JobDir="/Users/Dhy/Documents/Jobs/"
for Dir in $(find $MainDir* -maxdepth 0 -type d ); do
FolderName=$(basename $Dir);
preserve=''
for file in $JobDir*.job; do
if [[ $file =~ $FolderName.[0-9]+ ]]; then
preserve='on'
break
fi
done
if [ -z $preserve ]; then
rmdir $MainDir$FolderName
fi
done
p/s:.
在参数展开中不是一个特殊字符,所以您可以在不使用方括号的情况下使用它。
p/s2:这里不需要cd
,只需将路径附加到*
即可