簡體   English   中英

for循環中sed命令的問題

[英]Problems with sed command in for loop

我正在嘗試制作一個執行以下操作的bash腳本:

  1. 通過遞歸搜索dir和subdir來創建一個文件路徑數組
  2. 循環遍歷數組,為數組中的每個文件創建校驗和,並將文件路徑和文件校驗和存儲在自己的文件中。
  3. 如果先前對文件進行了哈希處理,則應刪除舊行,然后將其替換為更新的校驗和。 對於每個元素,在文件中搜索文件路徑,其中存儲了具有校驗和的文件路徑。 如果找到,則filecount變量存儲匹配量,並使用此變量來確定是應該替換文件還是僅添加文件。

問題是刪除包含先前存儲的文件路徑/校驗和的行的sed命令在for循環中不起作用。 但是,如果我將單個文件作為參數傳遞而不是創建文件數組並循環遍歷,則相同的算法也可以工作。

代碼示例如下:

#! /bin/bash

file_array=$(find sdcard -type f)

for path in ${file_array[@]}
do
    hash=$(shasum $path | cut -f 1 -d " ")

    # Search through the file that stores hashed files (path and chksum)
    file_count=$(grep -c -w $path droidhash.csv)

    echo "filecount: $file_count"

    #If the file is found, preform commands based on this
    if [ $file_count -ge 1 ]
    then
        echo "File found, replacing line"
        sed -i "/"$path"/d" droidhash.csv
        echo $path';'$hash | cat >> droidhash.csv
    else
        echo "File not found, adding line"
        echo $path';'$hash | cat >> droidhash.csv
    fi
done

運行腳本時收到的錯誤消息是:

“sed:-e表達式#1,字符9:未知命令:`f'”

是否可以在for循環中使用此sed命令?

要實際創建數組,您需要額外的括號:

file_array=( $(find sdcard -type f) )

然后,引用數組擴展非常重要

for path in "${file_array[@]}"

然后在您使用它的任何地方引用路徑變量

hash=$(shasum "$path" | cut -f 1 -d " ")

請參閱忘記在bash / POSIX shell中引用變量的安全隱患

既然你正在尋找一個固定的字符串,請告訴grep:

file_count=$(grep -F -c -w "$path" droidhash.csv)

然后按照@JH的建議:“$ path”包含斜杠字符,因此你需要在sed的s///命令中使用不同的分隔符。


第二個想法,我會像這樣重寫:

find sdcard -type f -print0 | while IFS= read -d "" -r path; do
    hash=$(shasum "$path" | cut -f 1 -d " ")
    if grep -q "^$path;" droidhash.csv; then
        echo "File $path found, replacing line"
        gawk -i inplace  '$1 == p {$2 = h}; 1'  FS=";" OFS=";" p="$path" h="$hash"  droidhash.csv
    else
        echo "File $path not found, adding line"
        echo "$path;$hash" >> droidhash.csv
    fi
done
    sed -i "/"$path"/d" droidhash.csv

你的報價很奇怪。 你可能會對sed -i ";${path};d" droidhash.csv

而不是else子句,只是無條件地附加到CSV。 不使用cat ,因為echo也可以附加。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM