1

実行時の引数は次のとおりです。$1ファイルのリストを含むファイルへのパスはファイルを含む $2ディレクトリへのパスです私がやりたいのは、にリストされている各ファイルがディレクトリに$1存在することを確認することです$2

私は次のようなことを考えています:

for f in 'cat $1'
  do
  if (FILEEXISTSIN$2DIRECTORY)
    then echo '$f exists in $2'
    else echo '$f is missing in $2' sleep 5 exit
  fi
done

ご覧のとおり、にリストされているファイルのいずれかがディレクトリに$1存在しない場合$2、スクリプトはこれを示してから閉じるようにします。頭がおかしくないのは(FILEEXISTSIN $ 2DIRECTORY)の部分だけです。私はあなたができることを知っていますが[ -e $f ]、それが$2ディレクトリに存在することを確認する方法がわかりません。

編集:これについてさらに考えてみると、ネストされたforループを使用できる可能性がありますか?

4

2 に答える 2

2

指定した入力ファイルに、確認するファイルの改行区切りのリストが含まれている場合、次のソリューション (while 読み取りループを使用) は、スペースを含むファイル名を適切に処理するのに十分堅牢です。

一般に、形式のループは使用しないでfor i in $(command)ください。代わりに、while ループを選択してください。詳細については、 http://mywiki.wooledge.org/DontReadLinesWithForを参照してください。

while read -r file; do
   if [[ -e "$2/$file" ]]; then
      echo "$f exists in $2"
   else
      echo "$f does not exist in $2"
      sleep 5
      exit 1
   fi
done < "$1"
于 2013-01-05T18:44:42.633 に答える
0

名前にスペースが含まれていないファイル名のリストを扱っているため ($(cat $1)表記がそのように分割されるため)、比較的単純です。

for file in $(cat $1)
do
    if [ -e "$2/$file" ]
    then echo "$file exists in $2"
    else echo "$file is missing in $2"; sleep 5; exit 1
    fi
done

基本的に、組み込みの文字列連結機能を使用してファイルへのフル パスを作成し、testor[演算子を使用してファイルの存在を確認します。

任意のファイル名を処理する必要がある場合、特に任意のファイル名の任意の文字の 1 つが改行文字になる可能性がある場合、複雑さが生じます。言うまでもなく、それらは問題を複雑にするので、あなたがそれを処理する必要があると言わない限り、私はそれに対処しません. 二重引用符で囲まれた変数展開は、それに対処するための戦略の重要な部分です。問題の別の部分は、ファイル名を変数に正確に取得する方法です。

于 2013-01-05T17:23:10.207 に答える