我正在處理腳本,我需要將文件名與另一個文件名進行比較,並查找特定更改(在此情況下,OS X需要添加文件時將「(x)」添加到文件名到一個目錄,當一個文件名已經存在),所以這是腳本的一個片段,修改後不經過其餘的測試。與通配符的文件名比較
#!/bin/bash
p2_s2="/Path/to file (name)/containing - many.special chars.docx.gdoc"
next_line="/Path/to file (name)/containing - many.special chars.docx (1).gdoc"
file_ext=$(echo "${p2_s2}" | rev | cut -d '.' -f 1 | rev)
file_name=$(basename "${p2_s2}" ".${file_ext}")
file_dir=$(dirname "${p2_s2}")
esc_file_name=$(printf '%q' "${file_name}")
esc_file_dir=$(printf '%q' "${file_dir}")
esc_next_line=$(printf '%q' "${next_line}")
if [[ ${esc_next_line} =~ ${esc_file_dir}/${esc_file_name}\ \(?\).${file_ext} ]]
then
echo "It's a duplicate!"
fi
我在這裏要做的是檢測如果文件next_line是p2_s2的副本。因爲我期望有多個副本,所以next_line可以在文件名末尾附加一個(1)或括號中的任何其他數字(儘管我確定沒有兩位數字)。由於我不能在中間做一個簡單的字符串比較,我嘗試使用「=〜」運算符並轉義所有特殊字符。任何想法我做錯了什麼?
對不起,這是一個傳統的PEBKAC,由我替換了我用於製作測試的實際條目。不幸的是,我的測試腳本在.docx和.gdoc之後正確定位了「(1)」。 –
但添加「set -x」顯示出錯: '$ {esc_file_dir}/$ {esc_file_name} \\(?\)。$ {file_ext}' 被解釋爲 '/ Path/to \ file \\(名稱\)/包含\ - \ many.special \ chars.docx \(?\)。gdoc' 而不是 '/ Path/to \ file \ \(name \)/ containing \ - \ many.special \ chars .docx \\(?\)。gdoc' 但是,添加一個額外的反斜槓會產生語法錯誤(duh)並添加兩個以產生此輸出: '/ Path/to \ file \\(name \)/ contained \ - \ many.special \ chars.docx \\ \(?\)。gdoc' 任何想法如何解決它? –
構建一個變量的文件名並在'=〜'測試中使用它(不加引號)。看看是否有幫助。多年來,bash在'=〜'的RHS上引發了各種引用/轉義問題。 –