Bash脚本用于删除文件夹名称并将其与不同目录中的部分文件名匹配

时间:2012-10-16 11:30:32

标签: bash shell compare pattern-matching

[编辑]问题解决了。脚本在下面更新。感谢大家的帮助。有一些我需要做的mod,使它全部适用于文件夹名称和非空文件夹中的空格。

真的很难用这个。

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

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

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

    • Johns.Pizza.Place
    • Marks.Hair.Salon.NY
    • Rachels.Bike.and.Boat.Shop
  3. 如您所见,文件夹名称始终与文件名的一部分匹配,但每个文件始终附加一个随机数的长度,然后是扩展名(即'.job')。

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

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

    2. 删除那些未找到关联文件的文件夹(我在某些操作后使用Hazel删除文件)。如果找到文件夹的匹配文件,我不希望删除该文件夹。

    3. 这是我尝试的但我知道它不完整。显然我正试图在路径中只提取文件夹名称以匹配部分文件名,其中我已删除了扩展名,但我不知道如何删除随机数字符串。

      [编辑]:下面的最终工作脚本

      #! /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
      

      非常感谢任何帮助。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

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

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

答案 2 :(得分:0)

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

同样在当前脚本中,只要第一个nameFolderName不匹配,就会删除该目录。正确的方法是检查所有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,只需将路径附加到*