2つのファイル名を比較する方法

2つのファイル名を比較する方法

フォルダ内の2つのファイルを比較し、名前から小さい数字を削除したいと思います。

たとえば、名前がと仮定しますyearMonthDay.txtsudo rmどの数字が小さいかを比較したいです。

以下から電話番号を受け取ることができることを知っています。

find *txt | awk -F'[_.]' '{ print $1}'

それでは、次にどのように比較する必要がありますか?システム変数を使用しますか?実際、私は以前にシェル変数を使ったことがありません。

ベストアンサー1

次のことをお勧めします。

「通常の」日付に似た名前を持ついくつかのファイルを含むディレクトリを作成しました。 1つは、名前にスペースがあり(引用符で囲む必要があります)、名前に改行があるファイルです(コマンドが区切られたファイルを使用する場合は改行であると仮定します)。

$ find
.
./20210710.txt
./20200131.txt
./20210611.txt
./2020?0131.txt
./20201131.txt
./2020 131.txt

次のコマンドラインは、txtファイルのリストを作成するstatために使用されます。find

$ find -name '*.txt' -exec stat -c '%N' {} \;
'./20210710.txt'
'./20200131.txt'
'./20210611.txt'
'./2020'$'\n''0131.txt'
'./20201131.txt'
'./2020 131.txt'

今すぐ並べ替えてください(拡張プログラムを削除せずにこれを行うことができます)。

$ find -name '*.txt' -exec stat -c '%N' {} \; | sort
'./20200131.txt'
'./20201131.txt'
'./2020 131.txt'
'./2020'$'\n''0131.txt'
'./20210611.txt'
'./20210710.txt'

最も古いものを選択してください(リストの上部から)

$ find -name '*.txt' -exec stat -c '%N' {} \; | sort | head -n1
'./20200131.txt'

これでファイルを削除できます

rm $(find -name '*.txt' -exec stat -c '%N' {} \; | sort | head -n1)

スペースやその他の特殊文字が含まれる危険性がある場合は、引用したいと思います(ただし、前の引用と矛盾しないように再確認してください)。

rm "$(find -name '*.txt' -exec stat -c '%N' {} \; | sort | head -n1)"

変数を設定し、後でシェルスクリプトのコマンドで使用することもできます。

#!/bin/bash

find -name '*.txt' -exec stat -c '%N' {} \; | sort

var1=$(find -name '*.txt' -exec stat -c '%N' {} \; | sort | head -n1)
echo '---'
read -p "Remove $var1? (y/N) " ans
if [ "$ans" == "y" ]
then
 eval rm "$var1"
fi

おすすめ記事