関連ファイル名を確認し、それらの1つを削除してください。

関連ファイル名を確認し、それらの1つを削除してください。

名前に文字列を含むファイルを見つけるには、スクリプトを作成する必要があります。名前は同じですが、対応する文字列を持たないファイルがある場合は、元のファイルを削除したいと思います。

たとえば、次のファイルが含まれているディレクトリにあるとします。

algomb
gomba
alb
algomba
alba

部分文字列が次のような場合、およびをgom考えてみましょう。各名前から削除した後、およびがあることを確認してください。存在するものなので削除していきます。algombgombaalgombagomalbbaalbaalbalbaalgombalgomba

alb
alba
gomba

私が終わったら、ディレクトリに。

私が試したことは次のとおりです。

#!/bin/bash
sz="gom"

talal=`find . -type f -name "*$sz*" -exec basename {} \;`
ossz=`find . -type f -exec basename {} \;`
c=`echo ${talal%%:*}${talal##*:}`

for c in ossz; do       
    if [ ! -d ]; then
        echo "This is a directory"  
    else    
        if [ -f ];
        then
            find .-type f -name "*$sz*" -exec basename {} \;  
        else
            echo ${talal%%:*}${talal##*:} 
        fi  
    fi
done

だからこれはうまくいきます。echo ${talal%%:*}${talal##*:}"gom"なしでファイル名を返します。ただし、この値をf結果とind . -type f -exec basename {} \;比較することはできません。

部分文字列が見つかった場合は、どのようにファイルをテストして適切なファイルを削除できますか?

答え1

以下は要件を満たす必要があります。

#!/bin/bash
sz="gom"
dir="/where/the/files/are"

find $dir -type f -name "*${sz}*" -print0 | while read -d '' -r c; do
    if [[ -f "$(echo $c | sed 's/'"${sz}"'//g')" ]]; then
        # Strip the 'echo' to have this actually do things
        echo rm -v "$c"
    fi
done

変更と修正に関する注意事項:

  • Find-printf "%f\n"に優れています-exec basename {} \;。この場合、スクリプトが非フラットディレクトリ構造に対して安全であるように、ディレクトリ名の削除からfindを削除しました。
  • for c in ossz動作しません。裸の名前osszは変数ではありません。$ossz必要です。
  • 読みやすくするために、sedbashパターンのマッチングと置換に頼るよりも、bashを使用する方が良いかもしれません。

例:

次のファイルを含むディレクトリの場合:

alb  alba  algomb  algomba  gomb

上記のスクリプトは以下を出力します。

rm -v ./algomb
rm -v ./algomba

関連情報