1

[编辑] 问题解决了。脚本更新如下。感谢大家的帮助。我需要做一些修改才能使其全部使用文件夹名称和非空文件夹中的空格。

真的很难对付这个。

下载文件后,我的系统会创建两件事:

  1. 一个文件(在我的“工作”目录中创建),例如

    • Johns.Pizza.Place.5489231.job
    • Marks.Hair.Salon.NY.888.job
    • Rachels.Bike.and.Boat.Shop.11122287865.job
  2. 带有文件名的文件夹(在我的“临时”目录中创建),例如

    • 约翰比萨店
    • Marks.Hair.Salon.NY
    • Rachels.Bike.and.Boat.Shop

如您所见,文件夹名称总是与文件名的一部分匹配,但每个文件总是附加一个随机数的长度,然后是扩展名(即“.job”)。

我想要做的是能够运行一个试图

  1. 匹配文件目录中的文件夹名称但仅进行部分匹配,因为文件同时添加了随机数和扩展名,然后

  2. 当找不到相关文件时删除这些文件夹(我在某些操作后使用 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

任何帮助是极大的赞赏。

4

3 回答 3

0

你可以这样做:

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
于 2012-10-16T11:37:26.257 回答
0

如果您绝对确定实际文件名不包含数字,则可以替换name=${file%%[.]*}name=${file%%.[0-9]*}.

同样在您当前的脚本中,只要第一个name不匹配,您就删除该目录FolderName。正确的做法是检查所有names 是否不匹配,即仅在内部 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,只需将路径附加到*

于 2012-10-16T22:12:15.473 回答
0

您对 %% 的使用是删除第一个点之后的所有内容,而不是最后一个点。像这样的东西可能是你想要的转换:

name="${file%.*.job}"

% 运算符是非贪婪的,因此它将选择要删除的最短匹配字符串。

于 2012-10-16T12:02:54.713 回答