1

[編集] 問題は解決しました。スクリプトを以下に更新しました。助けてくれてありがとう。フォルダー名のスペースと空でないフォルダーですべてが機能するようにするために、いくつかの改造が必要でした。

本当にこれで苦労します。

ファイルがダウンロードされると、私のシステムは次の 2 つを作成します。

  1. ファイル(私の「Jobs」ディレクトリに作成)、例えば

    • Johns.Pizza.Place.5489231.job
    • Marks.Hair.Salon.NY.888.job
    • Rachels.Bike.and.Boat.Shop.11122287865.job
  2. ファイルの名前を持つフォルダー(「Temp」ディレクトリに作成)、たとえば

    • ジョンズ・ピザ・プレイス
    • マークス.ヘア.サロン.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。これを行う正しい方法は、すべてnameの s が一致しないことを確認することです。つまり、内側の 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 に答える