この「for」ループに必要な入力をどのように取得できますか?

この「for」ループに必要な入力をどのように取得できますか?

TORからダウンロードしたコンテンツをバックアップするための小さなスクリプトを作成しましたが、その理由は、TORがプレースホルダファイル(元のファイル名を含む0バイトファイル)と実際にダウンロードしたファイル(元のファイル+拡張子.part)を事前にマージしようとすることです。試してみるからです。すべてのデータが失われます。

.partこのスクリプトを補完するために、ダウンロードが完了した後にバックアップファイルを削除するスクリプトが必要です。問題は、ダウンロードしたファイル名にスペースや特殊文字が含まれることが多く、二重引用符を使用する必要があることです。これは、複数のファイルをダウンロードするまでうまく機能します。その時点で、findすべてのファイルを1行に拡張し、一致テストステートメントはありません。 。

私のアプローチはすべて間違っている可能性がありますが、そうでない場合は、コマンドの個々のファイル名をどのように取得できますかrm

#!/system/bin/sh
if [ ! -d /sdcard/Download/tordownloadbackup ]; then
mkdir /sdcard/Download/tordownloadbackup
fi
echo 'backing-up'
find /sdcard/Download/ -maxdepth 1 -name '*.part' -print -exec cp {} /sdcard/Download/tordownloadbackup/ \;

for f in "`find /sdcard/Download/tordownloadbackup/ -type f |rev |cut -c 6-100| cut -d / -f 1 |rev`"; do

if [ -s /sdcard/Download/"$f" ]; then
    if [ -f /sdcard/Download/tordownloadbackup/"$f".part ]; then
    rm /sdcard/Download/tordownloadbackup/"$f".part
    d="$f".part
    echo "deleting $d"
    fi
fi
done
sleep 300
~/run.sh

ベストアンサー1

ファイル名に改行がないと確信している場合は、次のことができます。

find /sdcard/Download/tordownloadbackup/ -type f -printf '%f\n' |
    awk '{ print substr($0,1,length($0)-5); }' |
    while IFS= read -r filename; do
        : ...
    done

パス内のすべての文字に対する一般的なアプローチは次のとおりです。

find . -exec bash -c 'ls -l "$@"' bash {} +

おすすめ記事