名前に文字列を含むファイルを見つけるには、スクリプトを作成する必要があります。名前は同じですが、対応する文字列を持たないファイルがある場合は、元のファイルを削除したいと思います。
たとえば、次のファイルが含まれているディレクトリにあるとします。
algomb
gomba
alb
algomba
alba
部分文字列が次のような場合、およびをgom
考えてみましょう。各名前から削除した後、およびがあることを確認してください。存在するものなので削除していきます。algomb
gomba
algomba
gom
alb
ba
alba
alb
alba
algomb
algomba
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
必要です。- 読みやすくするために、
sed
bashパターンのマッチングと置換に頼るよりも、bashを使用する方が良いかもしれません。
例:
次のファイルを含むディレクトリの場合:
alb alba algomb algomba gomb
上記のスクリプトは以下を出力します。
rm -v ./algomb
rm -v ./algomba