Linux

找出文件夾中的文件是否以其他文件夾中的其他名稱存在

  • April 10, 2019

前面可能有點不正確的英語:

至少有 2 個文件夾。為此,A包含沒有副檔名的文件,通常是使用者名,而B包含類似的文件,副檔名為 ‘.yml’ 或可能沒有副檔名,甚至其他副檔名,但情況並非總是如此。

如何確定A文件夾中的文件是否存在於B中,可能在不同的副檔名下,而不使用 Python 等腳本語言?編寫 Python 腳本對我來說不是什麼大問題,但為了可移植性,我更喜歡 shell 腳本,我很討厭。更不用說我不知道所有的命令。

只有在非 Linux 系統(尤其是 BSD)中也能做到這一點,這才是好事。

編輯 0:名稱的不同並不總是副檔名,名稱可能在相同文本之前或之後有字元。例如,如果A有一個名為 的文件foobar,則它可以location_foobarB**中命名。否則名稱不會有更多不同,例如foo1bar,那是完全不同的東西,所以腳本不會尋找這種差異。

編寫一個循環遍歷一個目錄的文件並查找另一個目錄中是否存在名稱為超字元串的文件的 shell 腳本是一件簡單的事情。

#!/bin/sh
dirA=$1
dirB=$2
for x in "$dirA/"*; do
 base_name="${x##*/}"
 set -- "$dirB"/*"$base_name"*
 if [ -e "$1" ]; then
   for y; do
     echo "$base_name found in B as ${y##*/}"
   done
 else
   echo "$x not found in B"
 fi
done

這可移植到任何 Bourne/POSIX 樣式的 shell(sh、ash、bash、ksh、…)。使用的一些 shell 結構:

  • #!/bin/sh:每個腳本頂部的shebang行
  • $1, $2: 傳遞給腳本的兩個參數 A 和 B
  • ${x##*/}x減去表格的最長前綴的值*/,即$x減去最後的所有內容/,即最後一個之後的${x##*/}部分。$x``/
  • set -- "B/${x##*/}."*將位置參數設置為 B 中的匹配文件列表。如果沒有匹配項,則模式不展開,因此這會將第一個位置參數設置為以 . 結尾的字元串.*
  • for y; do循環位置參數。

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