$(cat list.txt)のfnのヘルプスクリプト/ IFS /

$(cat list.txt)のfnのヘルプスクリプト/ IFS /

次の形式のファイルのリストがあります。

file1.jpg
file2.jpg
file3.jpg
newline
newline
file4.jpg
file5.jpg
file6.jpg
newline
newline
file7.jpg
file8.jpg
file9.jpg
etc

私のbashスクリプトはIFS = $ "\ n"に設定されています。最初のファイルをスキップして残りのファイルを削除してから2つの改行が表示された場合は、カウントをゼロにリセットして次のバッチに対してもう一度やりたいと思います。 IFS を単一の改行に設定すると、予期しない結果が発生します。イメージファイルが正しく解析されなくなりました。スクリプトから IFS を削除すると、スクリプトは 2 つの改行を検出しません。助ける!そしてあらかじめありがとうございます。

パスワード:

#!/bin/bash
#
# MASS DELETE
#
IFS=$"\n\n"
count=0
deleted=0
saved=0
for fn in $(cat list.txt)
do
        length=${#fn}
        ext=${fn:length-3:3}
        echo "**$fn**"

        if [ $ext != "jpg" ]; then
                echo "**Newline**"
                count=0
        else
#               (( ++count ))
#               if [ $count -ge 1 ]; then
#                       echo "Removing $fn..."
#                       #rm $fn
#               else
#                       echo "Saving $fn..."
#               fi
                echo "Do Stuff"
        fi
done

出力(エラー!)

Rigel@Minty-VirtualBox:~/data/comics/2020$ ./mass_del.sh
**12-Dec/miltpriggee-2020-12-10.jpg
12-Dec/miltpriggee-2020-12-11.jpg
12-Dec/miltpriggee-2020-12-30.jpg
12-Dec/miltpriggee-2020-12-17.jpg
12-Dec/miltpriggee-2020-12-21.jpg
12-Dec/miltpriggee-2020-12-28.jpg
12-Dec/miltpriggee-2020-12-01.jpg
12-Dec/miltpriggee-2020-12-03.jpg
12-Dec/miltpriggee-2020-12-12.jpg
12-Dec/miltpriggee-2020-12-15.jpg
12-Dec/miltpriggee-2020-12-20.jpg
12-Dec/miltpriggee-2020-12-25.jpg
12-Dec/miltpriggee-2020-12-07.jpg
12-Dec/miltpriggee-2020-12-27.jpg
12-Dec/miltpriggee-2020-12-29.jpg
12-Dec/miltpriggee-2020-12-16.jpg
12-Dec/miltpriggee-2020-12-26.jpg
12-Dec/miltpriggee-2020-12-02.jpg
12-Dec/miltpriggee-2020-12-18.jpg
12-Dec/miltpriggee-2020-12-06.jpg
12-Dec/miltpriggee-2020-12-19.jpg
12-Dec/miltpriggee-2020-12-13.jpg
12-Dec/miltpriggee-2020-12-04.jpg
12-Dec/miltpriggee-2020-12-31.jpg
12-Dec/miltpriggee-2020-12-22.jpg
12-Dec/miltpriggee-2020-12-24.jpg
12-Dec/miltpriggee-2020-12-14.jpg
12-Dec/miltpriggee-2020-12-05.jpg
12-Dec/miltpriggee-2020-12-09.jpg
12-Dec/miltpriggee-2020-12-08.jpg
12-Dec/miltpriggee-2020-12-23.jpg


12-Dec/kevi**
**Newline**

ベストアンサー1

awk一重引用符を含むファイル名なしでこれを行うことができます。

awk -v q="'" '
    $0 == "" { count=0; next }
    count++ { print "Delete:", $0; system("echo rm -f -- " q $0 q) }
' list.txt

本当にシェルループを使用したい場合は、次のようにできます。

while IFS= read -r line
do
    # Blank line resets the skip counter
    if [ -z "$line" ]
    then
        count=0

    # Skip the first non-blank line (count==0) then delete others
    elif [ $((count++)) -gt 0 ]
    then
        echo "Delete: $line"
        echo rm -f -- "$line"
    fi
done <list.txt

どちらの場合も、先頭を削除してファイル削除操作を実行しますechoecho rm

おすすめ記事