Text-Processing

查找兩個目錄之間的文件名差異(忽略文件副檔名)

  • November 9, 2020

例如,我有很多文件需要保持同步:

./regular/*.txt
./compressed/*.txt.bz2

當文件上傳到 ./regular 我想製作一個腳本來定期檢查和 bzip2 壓縮尚未壓縮的文件。

在我的腦海裡,它就像……

ls ./regular/*.txt as A
ls ./compressed/*.txt* as B

for each in A as file
   if B does not contain 'file' as match
       bzip2 compress and copy 'file' to ./compressed/

有沒有一個程序可以做到這一點,或者有人可以展示這種事情是如何在 coreutils / bash 中完成的?

zsh而不是bash

regular=(regular/*.txt(N:t))
compressed=(compressed/*.txt.bz2(N:t:r))
print -r Only in regular: ${regular:|compressed}
print -r Only in compressed: ${compressed:|regular}

然後你可以這樣做:

for f (${regular:|compressed}) bzip2 -c regular/$f > compressed/$f.bz2

那是使用${A:|B}數組減法運算符(擴展到A bar的元素(不包括)的元素B)。

使用bashGNU 工具:

(
 export LC_ALL=C
 shopt -s nullglob
 comm -z23 <(cd regular && set -- *.txt && (($#)) && printf '%s\0' "$@") \
           <(cd compressed && set -- *.txt.bz2 && (($#)) &&
              printf '%s\0' "${@%.bz2}")
) |
 while IFS= read -rd '' f; do
   bzip2 -c "regular/$f" > "compressed/$f.bz2"
 done

然後由comm命令執行減法。這裡使用 NUL 分隔符來處理像 zsh 解決方案中的任意文件名。

引用自:https://unix.stackexchange.com/questions/585732