Bash

查找文件,排除目錄

  • February 16, 2022

我想在一個變數中組成一串命令行參數,然後使用它們來執行命令。我在下面展示了一個簡化的範例。這是一個名為“listfiles”的腳本。它讀取一個名為“忽略”的文件,其中包含不列出的文件,然後應該列出除這些文件之外的所有文件。完成我想做的事情的最佳方法是什麼?

ignorelist=( `cat "./ignore" `)
for LINE in "${ignorelist[@]}"
       do
               Ignore="$Ignore -path '$LINE' -prune -o ";
       done
  
find ${Ignore} -print

忽略文件的內容(兩個目錄名),:

./d1
./d2

bash -x 列表文件的輸出:

+ ignorelist=(`cat "./ignore" `)
++ cat ./ignore
+ for LINE in '"${ignorelist[@]}"'
+ Ignore=' -path '\''./d1'\'' -prune -o '
+ for LINE in '"${ignorelist[@]}"'
+ Ignore=' -path '\''./d1'\'' -prune -o  -path '\''./d2'\'' -prune -o '
+ find -path ''\''./d1'\''' -prune -o -path ''\''./d2'\''' -prune -o -print
.
./1
./2
./3
./d1
./d1/4
./d1/d1a
./d1/d1a/5
./d2
./ignore
./listfiles

我希望 d1 和 d2 以及下面的所有內容不包含在輸出中,或者忽略文件中的任何文件/目錄都不包含在輸出中。將整個命令儲存在 var 中並對其進行評估會更好嗎?

始終使用數組來儲存獨立的東西。確保為find. 不要在參數中嵌入額外的引號(這最終會導致您的命令失敗)。

#!/bin/bash

readarray -t ignorepaths <./ignore

ignoreopts=()
for pathname in "${ignorepaths[@]}"; do
       ignoreopts+=( -o -path "$pathname" )
done

find . \( "${ignoreopts[@]:1}" \) -prune -o -print

也可以看看


對於/bin/sh

#!/bin/sh

set --
while IFS= read -r pathname; do
   set -- "$@" -o -path "$pathname"
done <./ignore

shift

find . \( "$@" \) -prune -o -print

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