2016-04-15 93 views
3

我正在處理腳本,我需要將文件名與另一個文件名進行比較,並查找特定更改(在此情況下,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)或括號中的任何其他數字(儘管我確定沒有兩位數字)。由於我不能在中間做一個簡單的字符串比較,我嘗試使用「=〜」運算符並轉義所有特殊字符。任何想法我做錯了什麼?

回答

1

您可以修剪ps2_s2的延伸,修剪next_line的擴展包括數量在括號內,看看你會得到相同的文件名。如果你這樣做 - 這是重複的。爲了這樣做,[[允許我們在字符串和Glob之間執行比較。

我使用extglob+(...)模式,所以我可以使用+([0-9])來匹配括號內的數字。請注意,extglobshopt -s extglob啓用。

#!/bin/bash 

p2_s2="/Path/to/ps2.docx.gdoc" 
next_line="/Path/to/ps2(1).docx.gdoc" 

shopt -s extglob 
if [[ "${p2_s2%%.*}" = "${next_line%%\(+([0-9])\).*}" ]]; then 
    printf '%s is a duplicate of %s\n' "$next_line" "$p2_s2" 
fi 

編輯:

我現在看到你編輯你的問題,所以如果這個解決方案是不夠的,我肯定,這將是一個很好的模板一起工作。

0

next_line(1)不來最終.它在原來的文件名來之前,第二到最後.之前,但你只去掉一個.作爲擴展名。

因此,當您生成比較文件名時,最終會出現/Path/to\ file\ \(name\)/containing\ -\ many.special\ chars.docx\ \(?\).gdoc,這與您所期望的不符。

如果您已將set -x添加到腳本的頂部,您會看到shell實際上在做什麼並看到了這一點。

OS X在這種情況下實際做了什麼?是否在.gdoc? Does it add it before .docx`之前添加了(#)?它取決於OS X 是否知道文件名是什麼(它是某種類型,它可以本機打開)?

+0

對不起,這是一個傳統的PEBKAC,由我替換了我用於製作測試的實際條目。不幸的是,我的測試腳本在.docx和.gdoc之後正確定位了「(1)」。 –

+0

但添加「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' 任何想法如何解決它? –

+0

構建一個變量的文件名並在'=〜'測試中使用它(不加引號)。看看是否有幫助。多年來,bash在'=〜'的RHS上引發了各種引用/轉義問題。 –