Bash
查找文件,排除目錄
我想在一個變數中組成一串命令行參數,然後使用它們來執行命令。我在下面展示了一個簡化的範例。這是一個名為“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
也可以看看
- 將 shell 變數用於命令選項 ……和其他。
對於
/bin/sh
:#!/bin/sh set -- while IFS= read -r pathname; do set -- "$@" -o -path "$pathname" done <./ignore shift find . \( "$@" \) -prune -o -print