我正在運行可變大小和內容測試集的測試。資料檔案經常會新增和刪除。我正在尋找一種自動收集文件清單的方法。
所有檔案都位於D
;的子目錄中我需要將完整目錄和名稱添加到文字檔案中。但是,我只需要那些具有“配對”文件的文件,該文件具有相同的文件名但具有不同的擴展名(所以......不同的文件名,但以結構化方式)。所以,如果有MyFileName.A
和MyFileName.B
,那麼我想D/.../MyFileName
添加到文件列表中。
有.A
沒有.B
文件的文件,但沒有.B
沒有.A
文件的文件。如果 a.A
有一個.B
文件,則兩個文件位於同一目錄中。
有什麼建議嗎?
答案1
如果沒有檔案名稱包含任何換行符,您可以執行以下操作:
find D -type f \( -name '*.A' -o -name '*.B' \) |
sed 's/\.[^.]*$//' |
sort |
uniq -d >paired_files
.B
這應該適用於有文件而沒有文件的更一般情況.A
。
要使用最新的 GNU 工具處理任何檔案名稱:
find D -type f \( -name '*.A' -o -name '*.B' \) -print0 |
sed -z 's/\.[^.]*$//' |
sort -z |
uniq -dz |
tr '\0' '\n' >paired_files
答案2
如果您的陳述是正確的“沒有 .A 檔案就沒有 .B 檔案。”,則取得 .B 檔案清單並刪除副檔名。
find $directory-to-search -name "*.B" | sed -r -e "s~(.*)\.B~\1~g"
答案3
和zsh
:
print -rl mydir/**/*.A(.e_'REPLY=$REPLY:r; [[ -f $REPLY.B ]]'_)
:r
刪除擴展名,因此如果運行後$REPLY
was的內容變為; 其餘的類似mydir/somedir/somefile.A
REPLY=$REPLY:r
mydir/somedir/somefile
這個答案。