次の形式のファイルのリストがあります。
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
どちらの場合も、先頭を削除してファイル削除操作を実行しますecho
。echo rm